n>0 的 Sleep(n) 是否放弃 CPU 时间给其他线程

Does Sleep(n) with n>0 relinquish CPU time to other threads

在windows下使用VC++ 13,联机帮助说明使用Sleep(0) 会将当前线程时间片的剩余部分让给任何其他具有同等优先级的线程。其他值也是如此吗?例如如果我使用 Sleep(1000) 是 1000 毫秒的 CPU 时间用于当前线程 运行 可能被另一个线程使用的核心?我想这是特定于硬件和实现的,所以为了缩小它假设 Intel I5 或更好,Windows 7 或 8。

询问的原因是我有一个线程池class,我正在使用一个额外的监视器线程来报告进度,允许用户中止长进程等...

是的,零仅在信号方面具有特殊含义,没有最短等待时间。通常它可以被解释为 "I want to sleep for no-time" ,这没有多大意义。意思是"I want to give chance to other thread to run."

如果它不为零,则保证线程不会在指定的时间内被 returned,当然是在时钟分辨率内。当线程被挂起时,它在系统中处于挂起状态,并且在调度期间不被考虑。使用 0 它不会改变它的状态,所以它仍然准备好 运行,并且该函数可能会立即 return。

此外,我认为这与硬件无关,这纯粹是系统级别的事情。

MSDN: Sleep function

A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread continues execution.

XP特例说明如下:

Windows XP: A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. This behavior changed starting with Windows Server 2003.

MSDN 指出线程时间片的提醒已放弃给任何其他具有同等优先级的线程。这有点没有意义,因为优先级较高的线程会在线程调用 Sleep(0) 之前被安排,而优先级较低的线程会立即导致 Sleep(0) 到 return 而不会泄露任何内容。因此Sleep(0)默认只影响同等优先级的线程。

Sleep(0)的目的:触发调度器重新调度,同时将调用线程放在队列的末尾。如果队列中没有任何其他具有相同优先级的进程,则调用将立即 return。如果有其他线程,则延迟未定。注意:Windows调度器不是单线程,它遍布OS(详情:How does a scheduler regain control when wanted?)。

详细行为取决于系统计时器分辨率设置 (How to get the current Windows system-wide timer resolution)。此设置也会影响线程时间片,它随系统计时器分辨率而变化。

系统计时器分辨率定义了系统的心跳。这导致线程量子具有特定值。定时器解析粒度也决定了Sleep(period)的解析度。因此,睡眠周期的准确性由系统心跳决定。然而,高分辨率定时器设置会增加功耗。

周期 > 0 的 Sleep(period) 会触发调度程序并禁止调度调用线程 至少 请求的周期。 因此调用线程时间片被中断。它立即结束。

Sleep(period) 周期 > 0 放弃 CPU 时间给其他线程(如果适用)。

(进一步阅读:Few words about timer resolution, How to get an accurate 1ms Timer Tick under WinXP, and Limits of Windows Queue Timers)。