C# 等待方法不占用资源

C# 等待方法不占用资源,c#,multithreading,C#,Multithreading,像AutoResetEvent公开的WaitOne方法这样的线程阻塞方法如何不占用资源(CPU等) 我可以想象这样一个方法会有一个while循环,比如: public void WaitOne() { while(IsSet == false) { // some code to make the thread sleep } // finally call delegate } 但这显然是错误的,因为它会使CPU旋转。那么,所有这些黑

AutoResetEvent
公开的
WaitOne
方法这样的线程阻塞方法如何不占用资源(CPU等)

我可以想象这样一个方法会有一个while循环,比如:

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

    // finally call delegate
}

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

通常,这些概念依赖于底层操作系统事件构造,一旦触发事件(或者发生超时,如果适用),就会唤醒挂起的线程。因此,线程处于挂起状态,不消耗CPU周期


这就是说,在其他事件类型中还有其他的wait变体,其中一些尝试在挂起线程之前旋转几个周期,以防在调用之前或之后很快触发事件。还有一些轻量级锁定原语在等待触发时执行旋转(如
SpinWait
),但必须小心使用,因为长时间的等待会驱动CPU。

自动重置事件和手动重置事件利用操作系统的功能。有关此主题的更多信息,请参阅。

该方法在内核中实现。对于每个尚未准备好运行的线程,Windows都会保留一个列表,列出线程正在等待的所有可等待对象(事件等)。当一个可等待对象发出信号时,Windows会检查它是否能唤醒任何正在等待的线程。无需投票

这个第9频道的讲座有很多关于它如何工作的信息: