ebb
ebb

Reputation: 9387

Wait method not taking up resources

How can a thread blocking method like WaitOne method exposed by AutoResetEvent not take up resources (CPU etc.)?

I would imagine that such a method would simply have a while loop like:

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

    // finally call delegate
}

But that's clearly wrong, since it will make the CPU spin. So what's the secret behind all this black magic?

Upvotes: 2

Views: 137

Answers (3)

arx
arx

Reputation: 16904

The method is implemented in the kernel. For each thread that isn't ready to run, Windows keeps a list of all the waitable objects (events, etc.) that the thread is waiting on. When a waitable object is signalled, Windows checks if it can wake up any of the waiting threads. No polling required.

This channel9 talk has a lot of information about how it works: http://channel9.msdn.com/shows/Going+Deep/Arun-Kishan-Farewell-to-the-Windows-Kernel-Dispatcher-Lock/

Upvotes: 3

Henning Krause
Henning Krause

Reputation: 5422

The AutoResetEvent and ManualResetEvent take advantage of OS functions. See CreateEvent for more information on this topic.

Upvotes: 1

James Michael Hare
James Michael Hare

Reputation: 38427

Typically, these concepts rely on underlying operating system event constructs to wake up the suspended thread once the event is triggered (or a timeout occurs if applicable). Thus, the thread is in a suspended state and not consuming CPU cycles.

That said, there are other variations of wait in other event types, some of which attempt to spin for a few cycles before suspending the thread in case the event is triggered either before or quickly after the call. There are also some lightweight locking primitives that DO perform spins waiting for a trigger (like SpinWait) but they must be used with care as long waits can drive up the CPU.

Upvotes: 1

Related Questions