睡眠的意义(0)

时间:2010-09-16 14:00:36

标签: c++ visual-c++ process sleep

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

8 个答案:

答案 0 :(得分:45)

根据MSDN的Sleep文档:

  

值为零会导致线程   放弃剩余的时间   切片到任何其他线程   准备好了。如果没有别的   线程准备运行,功能   立即返回和线程   继续执行。

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

答案 1 :(得分:17)

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

  

值为零会导致线程   放弃剩余的时间   切片到任何其他线程   准备好了。如果没有别的   线程准备运行,功能   立即返回和线程   继续执行。

Source

答案 2 :(得分:14)

我担心我无法改善这里的MSDN docs

  

值为零会导致线程   放弃剩余的时间   切片到任何其他线程   准备好了。如果没有别的   线程准备运行,功能   立即返回和线程   继续执行。

     

Windows XP / 2000:值为零   导致线程放弃   剩余的时间切片到任何时间   其他相同优先级的线程   准备好了。如果没有别的   同等优先级的线程准备好了   运行,函数立即返回,   并且线程继续执行。   此行为从更改开始   Windows Server 2003。

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

答案 3 :(得分:14)

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

答案 4 :(得分:3)

Sleep(0);在该指令中,系统调度程序将检查任何其他可运行的线程,并可能根据线程优先级给予他们使用系统资源的机会。

在Linux上有一个特定的命令:sched_yield() 从手册页开始:

  

sched_yield()导致调用线程放弃CPU。该          线程被移动到队列的末尾以获得其静态优先级和a          新线程开始运行。

     

如果调用线程是最高优先级列表中的唯一线程          那时,它会在调用sched_yield()之后继续运行。

还有

  

sched_yield()的战略呼吁可以通过提供来提高绩效          其他线程或进程在(严重)争用时有机会运行          调用者已释放资源(例如,互斥)。避免          不必要或不恰当地呼叫sched_yield()(例如,何时          其他可调度线程所需的资源仍然由          调用者),因为这样做会导致不必要的上下文切换,          这将降低系统性能。

答案 5 :(得分:2)

在一个应用程序中....主线程寻找要做的事情,然后启动"工作"通过一个新的线程。在这种情况下,你应该在主线程中调用sched_yield()(或sleep(0)),这样你就不会在"中查找"工作,更重要的是工作"。我更喜欢睡眠(0),但有时这是过度的(因为你正在睡觉一小时)。

答案 6 :(得分:1)

Sleep(0)是一个功能强大的工具,它可以在某些情况下提高性能。在特殊情况下可以考虑在快速循环中使用它。当一组线程响应最大时,它们都应经常使用Sleep(0)。但是,在代码的上下文中找到响应意味着什么的统治者是非常重要的。

我在https://stackoverflow.com/a/11456112/1504523

中提供了一些细节

答案 7 :(得分:0)

我正在使用pthreads,由于某种原因,在我的mac上,编译器没有找到要声明的pthread_yield()。但似乎睡眠(0)是一回事。