std::queue под std::mutex в восемь раз при 16 потоках.Автор идёт от наивной реализации к финальной и на каждом шаге объясняет, что и почему ломается:
🔘mutex-вариант разваливается из-за context switch в ядре;
🔘наивный CAS-подход спотыкается о ABA и use-after-free;
🔘батчинг по 1024 слота на узел убирает аллокатор с горячего пути и чинит cache locality;
🔘hazard pointers безопасно освобождают память без локов;
🔘thread-local кэш узлов окончательно убирает кучу с быстрого пути.
По ходу хорошо разобраны мелочи:
alignas(64) против false sharing, выбор между compare_exchange_strong и weak, индивидуальный подбор acquire/release/relaxed/seq_cst под каждую операцию, паттерн DEFER в духе Go для парного Protect/Release.Бенчмарки на 5 млн элементов и 16-ядерном CPU:
🔘2P/2C — 150 мс против 250 мс у мьютекса;
🔘8P/8C — 309 мс против 2152 мс;
🔘16P/16C — 299 мс против 2600 мс;
🔘1P/8C — 254 мс против 3138 мс.
В конце автор замечает: для пары потоков
std::mutex остаётся правильным выбором, lock-free нужен там, где много контеншена — рендеринг, HFT, аудио, массовый ingestion.Полная версия: https://jaysmito.dev/blog/blog/04-fast-lockfree-queues/
@prog_stuff