2011-10-26 30 views
2

AutoResetEvent公开的线程禁止方法WaitOne如何不占用资源(CPU等)?不占用资源的等待方法

我会想象,这样的方法也只会像一个while循环:

public void WaitOne() 
{ 
    while(IsSet == false) 
    { 
     // some code to make the thread sleep  
    } 

    // finally call delegate 
} 

但是,这显然是错误的,因为它将使CPU旋转。那么这个黑魔法背后的秘密是什么?

回答

1

通常,这些概念依赖于底层操作系统事件结构来在事件触发(或适用时发生超时)时唤醒挂起的线程。因此,线程处于挂起状态并且不占用CPU周期。

也就是说,在其他事件类型中还有其他事件类型的其他变体,其中一些在暂停线程之前试图旋转几个循环,以防事件在调用之前或之后触发。还有一些轻量级的锁定原语会执行等待触发器的旋转(如SpinWait),但是必须小心使用,因为长时间的等待可以驱动CPU。

1

AutoResetEvent和ManualResetEvent利用了OS功能。有关此主题的更多信息,请参阅CreateEvent