Thread.Sleep(0)和Thread.Yield()之间的区别

Xos*_*uis 23 .net multithreading

由于Java早就有Sleep和Yield,我找到了该平台的答案,但不是.Net的答案

.Net 4包含新的Thread.Yield()静态方法.以前,将CPU移交给其他进程的常用方法是Thread.Sleep(0).

除了Thread.Yield()返回一个布尔值,还有其他性能,OS内部差异?

例如,我不确定Thread.Sleep(0)是否检查其他线程是否准备好运行,然后将当前线程更改为等待状态...如果不是这样,当没有其他线程准备就绪时,Thread.Sleep (0)看起来更糟糕的是Thread.Yield().

Vip*_*esh 8

正如Eric Lippert在封面博客中所解释的,同时演示如何实现锁定 源代码

.NET Framework为您提供了多种工具,可用于构建更复杂的等待策略:Thread.SpinWait将处理器置于紧密循环中,允许您等待几纳秒或几微秒而无需将控制权交给另一个线程.Thread.Sleep(0)将控制权交给任何具有相同优先级的就绪线程,或者如果没有,则继续保持当前线程.Thread.Yield将控制权交给与当前处理器关联的任何就绪线程.正如我们所见,Thread.Sleep(1)将控制权交给操作系统选择的任何就绪线程.通过仔细选择这些调用的混合并在实际条件下进行性能测试,您可以构建高性能实现,当然这也是CLR团队实际完成的工作.


Rha*_*ody 5

根据 MSDN,

使用Sleep(0) 时 ,操作系统不会安排线程在指定的时间内执行。

使用Yield() 产生线程当前时间片的其余部分。操作系统根据调用线程的优先级和可运行的其他线程的状态,将调用线程调度到另一个时间片。

所以在这方面有细微的差别。Thread.sleep 会将线程置于睡眠模式,并建议它在给定的毫秒数内停留在那里

  • 我认为在 CLR 或操作系统级别都没有 SLEEP 状态,只有 WAITING 和 READY 状态。我认为 Yield 可以直接移动到 READY,而 Sleep(n>0) 会移动到 WAITING,一旦间隔消失,就会移动到 READY。我认为 Sleep(0) 可以直接移动到 WAITING,而无需经过 SLEEP 状态。 (3认同)
  • @XoseLluis,即使 `Yield()` 在功能上等同于 `Sleep(0)`,我更愿意使用 `Yield()`,因为它清楚地说明了程序员的意图。 (2认同)