Unix 有多种 sleep API(sleep、usleep、nanosleep)。我所知道的唯一用于 sleep 的 Win32 函数是 Sleep(),它以毫秒为单位。
我看到大多数 sleep ,即使是在 Unix 上,都会显着地向上取整(即:通常约为 10 毫秒)。我已经看到,在 Solaris 上,如果您以 root 身份运行,您可以获得 10 毫秒以下的 sleep 时间,而且我知道这在 HPUX 上也是可能的,前提是启用了细粒度计时器内核参数。 Windows 上是否有更细粒度的计时器?如果有,API 是什么?
最佳答案
可悲的事实是,对此没有好的答案。多媒体定时器可能是你能得到的最接近的——它们只允许你将周期设置为 1 毫秒,但是(感谢 timeBeginPeriod
)它们实际上提供了大约 1 毫秒的精度,而大多数其他定时器只有大约 10-15 ms 作为规则。
还有很多其他候选人。乍一看,CreateWaitableTimer
和 SetWaitableTimer
可能看起来最接近,因为它们设置在 100 ns 内部。不幸的是,至少在我的测试中,您不能真正依赖于接近该分辨率的任何地方。从长远来看,它们可能确实提供了最好的可能性,因为它们至少可以让您指定小于 1 毫秒的时间,即使您目前无法依赖实现来提供(任何接近)该分辨率。NtDelayExecution
好像和SetWaitableTimer
差不多除了它是无证的。除非您打算使用/测试未记录的函数,否则在我看来 CreateWaitableTimer
/SetWaitableTimer
仅在记录的基础上是更好的选择。
如果您使用线程池,您可以尝试使用 CreateThreadPoolTimer
和 SetThreadPoolTimer
相反。我还没有对它们进行足够的测试,无法确定它们真正提供的分辨率,但我并不特别乐观。
计时器队列( CreateTimerQueue
、 CreateTimerQueueTimer
等)是 MS 推荐的多媒体计时器替代品,但(至少在我的测试中)它们并没有真正提供比 Sleep
更好的分辨率.
关于winapi - 是否有相当于 nanosleep 的 Windows?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7827062/