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

Does SleepEx guarantee that all pending completion callbacks get called before timeout?

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

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

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

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

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

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

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