Урок 12: Гонки данных, deadlock и атомарные операции
Этот урок углубляется в три сложные для отладки угрозы: гонка данных (точное определение в C++), deadlock (два потока ждут друг друга) и атомарные операции (std::atomic) как лёгкая альтернатива mutex для простых счётчиков.
data race = двое пишут на одной бумаге одновременно. deadlock = двое держат то, что нужно другому, и ждут. atomic = операция, которая неделима — её нельзя чередовать.
- гонка данных (data race)
- Согласно стандарту C++: два потока обращаются к одной и той же области памяти, хотя бы один пишет, и между ними нет синхронизации. Приводит к неопределённому поведению.
- неопределённое поведение (UB)
- Ситуация, когда стандарт C++ не определяет, что произойдёт — компилятор может сгенерировать любой код, включая сбои, неверные значения или иногда правильную работу.
- взаимоблокировка (deadlock)
- Состояние, при котором два или более потоков ждут друг от друга освобождения mutex, и ни один никогда не может продолжить.
- атомарная операция (atomic)
- Операция, которая выполняется как неделимая единица. std::atomic<T> в C++ гарантирует, что read-modify-write не будет прерван другим потоком.
- compare-exchange
- Атомарная операция, которая сравнивает текущее значение с ожидаемым; если они равны, заменяет его новым значением. Основа алгоритмов без блокировок (lock-free).