The asynchronous semaphore.
The asynchronous auto-reset event.
The asynchronous manual reset event.
Resuming waiting coroutines in parallel on the thread pool.
Distilling the pattern to its essence, and the building back up.
First a little demonstration.
Looking back on what we've done.
Discussion of what we've done so far.
Why allocate memory when you can have it given to you?
Doing it all ourselves, without any need to go into kernel mode.