.net Thread.Sleep(0)与Thread.Yield()之间的差异

k3fezbri  于 2023-01-10  发布在  .NET
关注(0)|答案(4)|浏览(213)

由于Java很久以前就有了Sleep和Yield,我发现answers适用于该平台,但不适用于.Net
Net4包含了新的Thread.yield()静态方法。以前将CPU移交给其他进程的常用方法是Thread.Sleep(0)。
除了Thread.yield()返回一个布尔值之外,在性能和操作系统内部方面还有什么不同吗?
例如,我不确定Thread.Sleep(0)是否会在将当前线程更改为等待状态之前检查其他线程是否准备好运行......如果不是这样,当没有其他线程准备好时,Thread.Sleep(0)看起来比Thread.yield()更糟糕。

zu0ti5jz

zu0ti5jz1#

正如Eric Lippert在他的Coverity blog帖子“How does locking work in C#?“中所解释的那样,同时演示了如何实现锁定-
.NET Framework提供了多种工具,可用于构建更复杂的等待策略:Thread.SpinWait将处理器置于一个紧密循环中,允许您等待几纳秒或微秒,而不会将控制权交给另一个线程。Thread.Sleep(0)将控制权交给任何具有相同优先级的就绪线程,如果没有,则继续处理当前线程。Thread.Yield将控制权交给与当前处理器关联的任何就绪线程。正如我们所看到的,Thread.Sleep(1)将控制权交给操作系统选择的任何就绪线程。通过仔细选择这些调用的组合并在实际条件下进行性能测试,您可以构建高性能实现,当然这是CLR团队实际所做的。

1qczuiv0

1qczuiv02#

根据MSDN,
使用Sleep(0)时,操作系统不会在指定的时间内调度线程的执行。
使用Yield()时,线程当前时间片的剩余部分被让出。操作系统根据调用线程的优先级和其他可运行线程的状态,将其调度到另一个时间片。
所以这里有一个很小的区别,Thread.sleep会把一个线程置于SLEEP模式,并建议它在那里停留给定的毫秒数,Thread.yield会把它置于WAIT模式,这样它可以立即再次运行,或者一个更高的进程线程可能会介入。

5kgi1eie

5kgi1eie3#

Thread.Sleep(0)立即放弃线程的当前时间片,主动将CPU移交给其他线程。
Framework 4.0的新Thread.Yield()方法也做同样的事情--除了它只放弃运行在相同处理器上的线程。
source

nlejzf6q

nlejzf6q4#

有很大的区别
如果Thread.Yield()Thread.Sleep(0)是兄弟!Thread.Yield()是最善良的兄弟!因为他更慷慨。但为什么呢?
基于Microsoft DocumentsThread.Yield()
使调用线程将执行交给另一个准备在当前处理器上运行的线程。操作系统选择要交给的线程
Yield方法将决策的责任移交给操作系统,并对操作系统说:“我现在不需要我的时间片。您可以将其用于其他线程。但如果没有人比我更有价值,请回来继续我的工作”
相比之下,Sleep(0)方法就没有那么仁慈了。他对OS说:“我想睡0毫秒。在这段时间里你可以做任何事情,但我一醒来你就必须为我服务并继续我的工作。我不在乎任何线程需要你”

相关问题