WaitForSingleObject的超时解析

当我使用WaitForSingleObject函数等待一个非信号事件时,我发现在某些情况下,调用将返回WAIT_TIMEOUT小于指定的超时时间。 简单地循环呼叫的超时设置为1000ms,我已经看到呼叫在低至990ms的时间内(在WinXP上运行)返回。 我使用QueryPerformanceCounter来获得独立于系统时间的时间测量,所以我不认为时钟漂移可能是一个答案。

这种行为对我来说没有任何实际问题,但我想更好地理解它。 看起来它可能在大约计时器分辨率的分辨率下工作。 微软是否发布关于此功能精度的更多细节? 我应该期待Vista的更高精度吗?


是的,WaitForSingleObject使用计时器滴答分辨率,它不使用像QueryPerformanceCounter这样的高分辨率计时器。

http://msdn.microsoft.com/en-us/library/ms687069(VS.85).aspx,有关“等待函数”的MSDN文章将对此进行扩展:

指定的超时间隔的精度取决于系统时钟的分辨率。 系统时钟以固定速率“滴答”。 如果超时间隔小于系统时钟的分辨率,则等待时间可能会超过指定的时间长度。 如果超时间隔大于一个小数点但小于两个,则等待可以在一个到两个滴答之间的任何位置,依此类推。

本文还解释了如何使用timeBeginPeriod提高系统时钟分辨率 - 但不建议这样做。

我可以想到几个原因。 首先,几乎所有的WaitForSingleObject用例都不需要更高的分辨率。 使用高分辨率的定时器会要求内核持续轮询定时器(不可行,因为内核代码不能保证始终运行),或者频繁地重新编程以产生中断(因为可能有多个WaitForSingleObjects并且很可能只有一个中断可编程中断)。

另一方面,已经有一个定时源不断更新,其分辨率对WaitForSingleObject,SetWaitableTimer和Sleep来说已经足够了。

链接地址: http://www.djcxy.com/p/62465.html

上一篇: Timeout resolution of WaitForSingleObject

下一篇: Interactive Graphviz graphs in a web application