为什么要睡1?

时间:2013-12-13 18:11:51

标签: windows multithreading context-switching

据我所知,在无限循环或其他地方,你可以睡眠(0)离开操作系统执行上下文切换并执行另一个线程(如果存在并准备执行)。 现在,我看到了一堆人们使用sleep(1)而不是sleep(0)的代码。

这是最佳的吗?
我在哪里可以找到有关它的文档?

2 个答案:

答案 0 :(得分:3)

如果您正在实现“检查文件是否存在,请重复直到存在,然后继续”,最好进行休眠(some_small_positive_number),这样就不会耗尽100%的CPU时间

这样的轮询循环几乎总是在程序中使用时不正确的计划的标志,但经常在命令行脚本中使用。

答案 1 :(得分:2)

99.9%的时间,这种短循环是设计不良的症状,对线程间通信的理解不足或只是懒惰,cos轮询似乎更容易。

多线程调用中的大多数while(true)循环根本不需要Sleep()调用,因为它们会阻塞其他一些调用,I / O或线程间同步对象。

在循环不阻塞任何内容的情况下,如果正在完成的工作正在取得真正的进展,则仍然不需要sleep()调用。进入sleep()调用只会减慢实际工作量。如果工作对整个系统产生不良影响,请降低工作线程的优先级,而不是在sleep()调用中推迟。

邪恶循环纯粹是为了轮询旗帜。经常这样做,睡眠()本身通常被认为是本质上的邪恶。它不是 - 应该停止滥用它。

在现代操作系统上,没有太多需要轮询的东西。例如,文件系统在创建文件时发出通知,无需持续检查和消除sleep()循环的延迟和CPU浪费。