Without the futex, it's futile
Без futex всё тленно
Книга The Art of Multiprocessor Programming (2-е изд., 2021) считается канонической, но она обходит стороной futex — ключевой примитив современной многопоточности. Это упущение делает пособие бесполезным для практиков.
Futex ≠ mutex
Название происходит от «fast userspace mutex», но futex — это не мьютекс, а основа для всех высокоэффективных примитивов синхронизации. До него всё строилось на громоздких System V IPC, которые не масштабировались: при 1000 потоков futex в 2002-м оказался в 20–120 раз быстрее sysv-блокировок. Windows и macOS добавили аналоги только в 2012 и 2016 гг.
Суть futex
Он разделяет блокировку и ожидание/пробуждение:
- В user-space проверяем состояние; если свободно — захватываем без системного вызова.
- При конфликте вызываем
futex_wait(addr, expected)
, засыпаем в ядре на конкретном адресе. - Пробуждение —
futex_wake(addr, n)
, гдеn
обычно 1 или «все».
Передаваемое в wait
значение защищает от «просыпания» после уже случившегося события: если память изменилась, системный вызов мгновенно возвращает ошибку.
Такой подход убирает лишние системные вызовы и позволяет строить быстрые мьютексы, rw-lock’и, семафоры и пр. без поллинга и экспоненциальных бэкоффов.
Итог
Любая современная библиотека (pthreads
, C++ std::mutex
, Rust std::sync
) опирается на futex. Учебник, игнорирующий этот примитив, не готовит к реальной разработке.