Sleep与Yield的区别

作者:追风剑情 发布于:2017-9-26 20:12 分类:C#

Sleep()

       线程调用Sleep()来告诉系统它在指定的时间内不想被调度。这个方法导致线程在指定时间内挂起。调用Sleep允许线程自愿放弃它的时间片的剩余部分。系统会使线程在大致指定的时间里不被调度。没有错——如果告诉系统你希望一个线程睡眠100毫秒,那么会睡大致那么长的时间,但也有可能会多睡眠几秒、甚至几分钟的时间。记住,Windows不是实时操作系统。你的线程可能在正确的时间唤醒,但具体是否这样,要取决于系统中正在发生的事情。Sleep(-1)告诉系统永远不调度线程,但这样做没有什么意义。更好的做法是让线程退出,回收它的栈和内核对象。Sleep(0)告诉系统调用线程放弃了它当前时间片的剩余部分,强迫系统调度另一个线程。但系统可能重新调度刚才调用了Sleep(0)的线程(如果没有相同或更高优先级的其他可调度线程,就会发生这种情况)

Yield()

       线程通过调用Yield()可要求Windows在当前CPU上调度另一个线程,如果Windows发现有另一个线程准备好在当前处理器上运行,Yield就会返回true,调用Yield的线程会提前结束它的时间片,所选的线程得以运行一个时间片。然后,调用Yield的线程被再次调度,开始用一个全新的时间片运行。如果Windows发现没有其他线程准备在当前处理器上运行,Yield就会返回false,调用Yield的线程继续运行它的时间片。Yield方法旨在使“饥饿”状态的、具有相等或更低优先级的线程有机会运行。如果一个线程希望获得当前由另一个线程拥有的资源,就调用这个方法。如果运气好,Windows会调度当前拥有资源的线程,而那个线程会让出资源。然后,当调用Yield的线程再次运行时就会拿到资源。调用Yield的效果介于Sleep(0)和Sleep(1)之间。Sleep(0)不允许较低优先级的线程运行,而Sleep(1)总是强迫进行上下文切换,而由于内部系统计时器的解析度的问题,Windows总是强迫线程睡眠超过1毫秒的时间。

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号