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

时间:2015-03-12 12:44:43

标签: c++ windows multithreading sockets network-programming

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

1 个答案:

答案 0 :(得分:1)

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

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

一般来说,最佳做法是在循环中等待APC,在等待中使用无限超时。如果您需要定期执行某些操作,可以使用waitable timergenerate an APC periodically

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

但是,如果必须执行某些无法在APC中处理或由同步对象触发的定期操作,则可以使用嵌套循环:内部循环不执行任何操作,只是重复调用等待(超时时间减少了无论循环已经运行多长时间,外循环都会执行定期操作。

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