As we know now1, one needs both locks and condition variables to solve a broad range of relevant and interesting concurrency prob-lems. One of the first people to realize this years ago was Edsger Di-jkstra (though it is hard to know the exact history [GR92]), known among other things for his famous “shortest paths ” algorithm in graph theory [D59], an early polemic on structured programming en-titled “Goto Statements Considered Harmful ” [D68a] (what a great title!), and, in the case we will study here, the introduction of a pow-erful and flexible synchronization primitive known as the semaphore [D68b,D72]. Indeed, he invented this general semaphore as a single primitive for all things related to synchronization; as you will see, one can u...