🫖 Измеряем время затрачиваемое блокировками
Автор статьи взял и замерил: mutex, futex, горячий atomic-спинлок — что сколько реально стоит в тактах, и когда какой примитив выбрать.
❗ Ключевые моменты статьи:
• std::mutex — стабильные ~25 накладных тактов, но 40 байт памяти на объект
• futex через std::atomic wait/notify — ~14 тактов в удачном случае, но осторожно с contention
• горячий спинлок — 2–4 такта накладных, однако может съесть всё ядро и заморозить владельца лока
Основной фокус — бенчмарк на реальных данных: пул 128 МБ мелких защищённых объектов, два конкурирующих потока, измерение влияния cache-line соседства и contention.
Спойлер из выводов: unique_ptr<mutex> — неплохой безопасный дефолт, с которого не стыдно начать. А futex стоит рассматривать только если память давит и вы точно замерили свой contention — иначе легко получить проигрыш там, где ждали выигрыш.
👉 Статья