gpt4 book ai didi

c++ - SleepEx 是否保证在超时之前调用所有挂起的完成回调?

转载 作者:行者123 更新时间:2023-11-30 05:46:13 25 4
gpt4 key购买 nike

我有一个使用重叠 IO 进行网络通信的 C++ 程序。主线程有一个调用 SleepEx(5, true); 的循环。还有两个 TCP 套接字。我假设在可警告等待期间调用完成回调。还假设在 SleepEx 被调用时,我的两个 TCP 连接都收到了一些数据。现在的问题是,如果第一个完成回调花费的时间超过 5 毫秒,会发生什么情况? SleepEx 是在调用第一个回调后返回还是也调用了第二个回调?换句话说,SleepEx 是否保证调用 ALL 预定的完成回调?这还不清楚,因为文档说它会在至少一个事件满足时返回……

最佳答案

您的代码不得假定两个 APC 都将在 SleepEx() 返回之前被调用。相反,它不能假定挂起的 APC 不会仅仅因为指定的等待时间已过期而被调用。

您唯一可以依赖的行为是,如果一个或多个 APC 待处理,则至少会执行一个。

一般来说,最佳做法是在一个什么都不做的循环中等待 APC,在等待中使用无限超时。如果你需要定期做某事,你可以使用 waitable timergenerate an APC periodically .

或者,您可以使用 WaitForSingleObjectEx() 或 WaitForMultipleObjectsEx() 来检测可等待计时器或其他同步对象何时被触发,同时仍然处理 APC。

但是,如果您必须执行一些无法在 APC 中处理或由同步对象触发的周期性操作,则可以使用嵌套循环:内部循环除了重复调用等待之外什么都不做(超时时间减少了无论循环已经运行多长时间)并且外循环执行周期性操作。

如果您必须执行某些不能被挂起的 APC 延迟的周期性操作,则需要在单独的线程中执行。请注意,由于 Windows 不是实时操作系统,您仍然无法保证任何给定操作都会在任何特定时间范围内发生,尽管您可以通过提高线程优先级来降低风险。

关于c++ - SleepEx 是否保证在超时之前调用所有挂起的完成回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29010105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com