Опасные ловушки C++: гонки и скрытые баги многопоточности — 1 июля 2026 г. в 10:00:02.497
Опасные ловушки C++: гонки и скрытые баги многопоточности 👋 Приветствую в мире цифровой безопасности! В прошлый раз разобрали память и UB. Сегодня про многопоточность, где ошибки не воспроизводятся стабильно и находятся уже в продакшне. ⏺Data race: два потока одновременно обращаются к одной переменной, хотя бы один из них пишет. Компилятор не запрещает, sanitizer поймает, а в продакшне это любое поведение - от неправильного результата до крэша: int counter = 0; void increment() { counter++; // не атомарно: read → modify → write } Даже простой инкремент это три операции. Два потока могут прочитать одно значение, оба инкрементируют, один результат потеряется. ⏺Решение: std::atomic для простых типов, mutex для сложных структур: std::atomic<int> counter = 0; counter++; // атомарно, потокобезопасно std::mutex mtx; std::lock_guard<std::mutex> lock(mtx); // критическая секция ⏺TOCTOU (Time Of Check To Time Of Use): проверили условие, потом использовали, а между этими двумя моментами другой поток изменил состояние: if (balance >= amount) { // проверка // другой поток уже снял деньги здесь balance -= amount; // использование } Классика в финансовом коде и файловых операциях. Решается атомарными транзакциями или мьютексом на всю операцию целиком, а не только на проверку. ⏺Deadlock: два потока ждут друг друга и оба заблокированы навсегда: // Поток 1 // Поток 2 lock(A); lock(B); lock(B); // ждёт lock(A); // ждёт ⏺Решение тут такое: всегда захватывать мьютексы в одинаковом порядке во всём коде, или использовать std::scoped_lock который захватывает несколько мьютексов атомарно без дедлока: std::scoped_lock lock(mutexA, mutexB); ⏺ ThreadSanitizer ловит большинство гонок при запуске, не только при компиляции: g++ -fsanitize=thread -g app.cpp -o app ./app TSan добавляет накладные расходы примерно 5-10x по памяти и 2-5x по времени - только для тестирования, не для продакшна. Но именно в тестировании под нагрузкой он находит то что месяцами не воспроизводилось на проде. 🤖Бесплатный ChatGPT

