睡眠的意义(0)

bdh*_*har 45 c++ sleep process visual-c++

我曾经Sleep(0)在我的代码的某些部分看到一些无限/长while循环可用.我被告知它会使时间片可用于其他等待进程.这是真的?有什么意义Sleep(0)吗?

Nic*_*yer 48

根据MSDN的Sleep文档:

值为零会导致线程将其时间片的剩余部分放弃到准备运行的任何其他线程.如果没有其他线程准备好运行,则该函数立即返回,并且线程继续执行.

要实现的重要一点是,这可以让其他线程有机会运行,但是如果没有准备好运行,那么你的线程会继续 - 将CPU使用率保持在100%,因为某些东西将一直运行.如果while循环在等待某些条件时正在旋转,您可能需要考虑使用像事件这样的同步原语进行休眠,直到条件满足或休眠一小段时间以防止最大化CPU.


Sjo*_*erd 17

是的,它让其他线程有机会运行.

值为零会导致线程将其时间片的剩余部分放弃到准备运行的任何其他线程.如果没有其他线程准备好运行,则该函数立即返回,并且线程继续执行.

资源


Ste*_*end 14

我担心我无法改进这里的MSDN文档

值为零会导致线程将其时间片的剩余部分放弃到准备运行的任何其他线程.如果没有其他线程准备好运行,则该函数立即返回,并且线程继续执行.

Windows XP/2000:值为零会导致线程将其时间片的剩余部分放弃到准备运行的任何其他具有相同优先级的线程.如果没有其他具有相同优先级的线程准备运行,则该函数立即返回,并且线程继续执行.从Windows Server 2003开始,此行为已更改.

请注意(通过upvote)这里有关效率问题的两个有用的答案.


Ale*_*x F 14

注意Sleep(0),如果一个循环迭代执行时间很短,这会显着减慢这种循环.如果这对于使用它很重要,则可以调用Sleep(0),例如,每100次迭代调用一次.

  • 我没有看到将Sleep(0)置于一个也应该很快的循环中是多么合理. (2认同)