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

时间:2010-06-02 10:51:35

标签: .net multithreading

由于Java从很久以前就已经有睡眠和产量,我已经为该平台找到answers,但不是.Net

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:4)

根据MSDN,

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

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

所以这方面有一点不同。 Thread.sleep会将一个Thread置于SLEEP模式,并建议它保持给定的毫秒数 Thread.yield会将其置于WAIT模式,以便它可以立即再次运行,或者更高的进程线程可能会介入。

答案 2 :(得分:3)

Thread.Sleep(0)立即放弃线程的当前时间片,自愿将CPU交给其他线程。

Framework 4.0的新Thread.Yield()方法做了同样的事情 - 除了它只放弃在相同处理器上运行的线程。

source

相关问题