In the year nineteen hundred and sixty-five, Professor Dijkstra lit a cigarette in the computing hall at Eindhoven and wrote, upon a sheet of onion-skin paper, two lowercase letters: P and V. With these modest symbols he minted the semaphore, and thereby taught machines to wait for one another with grace.
What followed was a quiet revolution. The single thread of execution, once so tidy in its linearity, splintered into many. Processes learned to converse across channels. Locks were forged; mutexes were negotiated; monitors kept watch over shared memory as cathedral guards keep watch over relics.
“Concurrency is the art of arranging, in time, the things a machine must do — and then trusting it to arrange them well.” — marginalia, BYTE Magazine, Jun. 1978
Every icon on the adjacent page names a primitive drawn from that long conversation. Regard them as you would regard the glyphs on a medieval astrolabe: small, precise, and capable — in the right configuration — of navigating whole continents of computation.
Fig. 1 — a partial census of concurrent primitives, after the manner of the ACM.