-1

我知道,在无限循环或其他地方,您可以 sleep(0) 让操作系统执行上下文切换并执行另一个线程(如果有并且它已准备好执行)。现在,我看到一堆代码,人们使用 sleep(1) 而不是 sleep(0)。

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

4

2 回答 2

3

如果您正在实现类似“检查文件是否存在,重复直到它存在,然后继续”之类的东西,最好执行睡眠(some_small_positive_number),这样您就不会占用 100% 的 CPU 时间。

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

于 2013-12-13T18:16:48.137 回答
2

99.9% 的情况下,如此短的循环是设计不佳、对线程间通信理解不足或只是懒惰的症状,因为轮询似乎更容易。

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

在循环不会阻塞任何东西的情况下,如果正在完成的工作正在取得真正的进展,您仍然不需要 sleep() 调用。进行 sleep() 调用只会减慢实际工作的速度。如果工作对整个系统产生了不良影响,请降低工作线程的优先级,而不是在 sleep() 调用中推波助澜。

邪恶的循环纯粹是为了轮询标志。这种情况经常发生,以至于 sleep() 本身通常被认为本质上是邪恶的。不是——应该停止滥用它。

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

于 2013-12-13T19:10:59.717 回答