
Lock-free в C++: когда оправдан, а когда стреляет в ногу
Lock-free очередь звучит как способ выжать всё из многопоточности, но на практике чаще проигрывает мьютексу. Разбираем, где atomic реально помогает, а где добавляет багов и не даёт прироста.

Lock-free очередь звучит как способ выжать всё из многопоточности, но на практике чаще проигрывает мьютексу. Разбираем, где atomic реально помогает, а где добавляет багов и не даёт прироста.

Сервис работал месяцами, а после пересборки базового образа начал падать с SIGSEGV на пиковом трафике. Разбираем, как несовпадение ABI переживает сборку и линковку и всплывает именно под нагрузкой.

Шаблонная магия экономит время выполнения, но платит за это временем компиляции и памятью. Разбираем, где именно горит компилятор и как это измерить в C++17/20.

Почему SFINAE молчит вместо ошибки, как компилятор проверяет concept и во что превращается CRTP на этапе кодогенерации — разбор механики трёх приёмов, а не их синтаксиса.

Вы написали std::move, а копирование всё равно произошло. Разбираем случаи, когда перемещение тихо превращается в копию, и как это увидеть на компиляторе, а не в профайлере под нагрузкой.

Профилировщик показал, что 40% времени в горячем цикле уходит на malloc и free. Разбираем, когда стандартный аллокатор мешает и как написать свой — пул, стек и арену — на PMR из C++17.

Два потока пишут в разные переменные, а масштабирования нет. Разбираем, почему счётчики в одном массиве душат друг друга через кэш-линию и как это измерить и починить.

Один и тот же обход матрицы отличается по скорости в разы, хотя число операций одинаковое. Разбираемся, почему промах кеша стоит десятки тактов и как раскладка данных решает исход на горячем пути.

Пометка inline и агрессивный инлайнинг компилятора не всегда дают выигрыш. Разбираем, когда инлайн раздувает бинарник, ломает I-cache и почему замеры важнее интуиции.

Компилятор переставляет чтения памяти, выкидывает «мёртвые» проверки и склеивает вызовы. Под многопоточной нагрузкой это оборачивается гонками и зависаниями, которых в -O0 не было.

Программа с UB может годами работать в отладке и падать в проде после смены компилятора. Разбираем, почему это происходит, где чаще всего прячется UB и как его ловить.

Почему два потока видят записи в разном порядке, что на самом деле означают memory_order_relaxed и seq_cst и где счётчик на atomic всё равно ломается.