Кто не любит блокировать мьютексы? Поднимите руки. Я их пожму.
Начнём с истории. История - это не только интересно, но ещё и важно. Потому что я так сказал.
В Линуксе и в Винде до 2000х примитивы (и не очень) синхронизации были впаяны в ядро. Общаться с ними приходилось сисколлами, а это дороговато. Самое обидное, когда за ресурсом редко конкурентно обращаются (а это частый кейс), и ты перфомансом за воздух платишь. В какой-то момент это преодолело критический порог, таки постоянно контексты дрочить и планировщику по хуйне мозги ебать - экспириенс ниже среднего. Тогда-то к 2003-му в Линукс и завезли futex, в честь fast userspace mutex.
Была такая ОС, Solaris называлась, Sun её породили. Поскольку ребята ещё с 80х вкладывались в многоядерные и многопроцессорные машины, к концепту futex'а они пришли ещё в 1990х. Всё-таки приятнее, когда синхронизация съедает чуть меньше, чем всё. Сам концепт прост как три пизды - атомарный флаг "занято", если нет - выставляем, а сами пользуемся. К ядру с унылым еблом идём, только когда гонка проиграна и флаг оказался выставлен до нас. Собственно, это и есть наш happy-path в uncontended locks.
BSD делала примерно так же в то время, потому что на ней тогда ещё часто крутились базы данных и вебсервера. Ну, а ещё её трогали университеты. Чего ещё ожидать от грязных лап ак*демиков.
Линукс, как и Винда, в те времена целились на потребительский же сегмент, а там редко возникала проблема многоядерности. Поэтому они и явились столь поздно на сей праздник перфоманса.
Только вот у Windows NT был обширный (реально сука обширный!) арсенал объектов синхронизации (такое примитивом называть - что Христа предать), который представлял из себя ядерные объекты. Ну, то есть, в Линуксе это просто
int value, а в Винде прям полноценные объекты, с кучей дополнительного контента. Главный фокус - ты можешь кинуть сразу несколько объектов в WaitForMultipleObjects(), и ядро переварит их. Это буквально как select в Go, можно сразу из нескольких источников ждать. Только если Go ограничивается каналами, то в винде это могли быть пайпы, файлы, ивенты, таймеры, потоки, процессы - что угодно. Яж говорил, арсенал солидный. Только в Windows 8 микрософты допёрли, что люд просит легковесных примитивов. Тогда-то и появился WaitOnAddress, который абсолютно тот же futex. Теперь у нас два мьютекса ебать. Один старый-добрый со всем багажом контента, а второй лёгкий на WaitOnAddress.