It's more like UNIX and Linux being way behind on threading technology. User space mutexes were in QNX over two decades ago. And on the UNIVAC 1108 half a century ago.[1] Here's a implementation from 1972, by John Walker.<p><pre><code> . DIJKSTRA P FUNCTION
.
.
. LA,U A0,<QUEUE>
. LMJ X11,P
. <RETURN> X5 DESTROYED
.
P* TS QHEAD,A0 LOCK THE QUEUE
LX X5,QN,A0 LOAD QUEUE COUNT
ANX,U X5,1 BACK UP THE COUNT
SX X5,QN,A0 REPLACE THE COUNT IN THE QUEUE
TN X5 DO WE NEED TO DEACTIVATE HIM ?
J PDONE NO. SKIP DEACTIVATION
ON TSQ=0
LX X5,QHL,A0 LOAD BACK LINK OF QUEUE
SX X5,QHL,X4 PUT INTO BACK LINK OF ACTIVITY
SX X4,QFL,X5 CHAIN ACTIVITY TO LAST ACTIVITY
SA A0,QFL,X4 CHAIN HEAD TO NEW ACTIVITY
SX X4,QHL,A0 MAKE THE NEW ACTIVITY LAST ON QUEUE
CTS QHEAD,A0 RELEASE PROTECTION ON QUEUE HEAD
SCHDACT* DACT$ . DEACTIVATE PROCESS
OFF
ON TSQ
C$TSQ QHEAD,A0 WAIT FOR C$TSA
OFF
J 0,X11 RETURN AFTER ACTIVATION
.
PDONE CTS QHEAD,A0 UNLOCK THE QUEUE
J 0,X11 RETURN
</code></pre>
And that followed Djykstra's paper, published in Dutch in the late 1960s.<p>[1] <a href="https://www.fourmilab.ch/documents/univac/fang/" rel="nofollow">https://www.fourmilab.ch/documents/univac/fang/</a>