我曾经在代码的某些部分看到Sleep(0)
,其中有一些无限/长while
循环可用。我被告知它会使时间片可用于其他等待进程。这是真的? Sleep(0)
是否有任何意义?
答案 0 :(得分:45)
根据MSDN的Sleep文档:
值为零会导致线程 放弃剩余的时间 切片到任何其他线程 准备好了。如果没有别的 线程准备运行,功能 立即返回和线程 继续执行。
要实现的重要一点是,这可以让其他线程有机会运行,但是如果没有准备好运行,那么你的线程会继续 - 从之后将CPU使用率保持在100%将一直在运行。如果while循环在等待某些条件时正在旋转,您可能需要考虑使用像事件这样的同步原语来休眠,直到条件满足或休眠一小段时间以防止最大化CPU。
答案 1 :(得分:17)
答案 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)。但是,在代码的上下文中找到响应意味着什么的统治者是非常重要的。
中提供了一些细节答案 7 :(得分:0)
我正在使用pthreads,由于某种原因,在我的mac上,编译器没有找到要声明的pthread_yield()。但似乎睡眠(0)是一回事。