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().
正如Eric Lippert在封面博客中所解释的,同时演示如何实现锁定 源代码
.NET Framework为您提供了多种工具,可用于构建更复杂的等待策略:Thread.SpinWait将处理器置于紧密循环中,允许您等待几纳秒或几微秒而无需将控制权交给另一个线程.Thread.Sleep(0)将控制权交给任何具有相同优先级的就绪线程,或者如果没有,则继续保持当前线程.Thread.Yield将控制权交给与当前处理器关联的任何就绪线程.正如我们所见,Thread.Sleep(1)将控制权交给操作系统选择的任何就绪线程.通过仔细选择这些调用的混合并在实际条件下进行性能测试,您可以构建高性能实现,当然这也是CLR团队实际完成的工作.
根据 MSDN,
使用Sleep(0) 时 ,操作系统不会安排线程在指定的时间内执行。
使用Yield() 产生线程当前时间片的其余部分。操作系统根据调用线程的优先级和可运行的其他线程的状态,将调用线程调度到另一个时间片。
所以在这方面有细微的差别。Thread.sleep 会将线程置于睡眠模式,并建议它在给定的毫秒数内停留在那里