Границы и цена -race
Детектор молчал на биллинге: все обращения были под мьютексом, а баланс всё равно уходил в минус. Миша измерил цену инструмента: десять раз медленнее и заметно больше памяти. Сергей закрепил правило: -race — инструмент тестов и CI, а не прода.
race detector ловит только гонки на пройденных путях кода, не видит логические гонки и платит за это памятью и ~10-кратным замедлением.
Видит только пройденное
Детектор ловит гонку, только если оба конфликтующих обращения реально случились в прогоне. Гонка в ветке if debug не проявится, пока тест не пройдёт по этой ветке. Поэтому -race в CI работает насколько хорошо, насколько хороши тесты: непокрытые пути — слепая зона детектора.
Не видит логические гонки
Race detector ловит гонки данных, а не ошибки порядка операций. Если все обращения защищены мьютексом, но между отдельными операциями инвариант нарушается — это race condition, и детектор промолчит: формально всё синхронизировано. Разница между data race и race condition — урок. Здесь достаточно понимать: -race — не сертификат корректности, он ловит только один класс ошибок.
Цена
-race-сборка медленнее примерно в 10 раз и ест заметно больше памяти: каждое обращение к памяти оборачивается в теневую память и проверки. Поэтому race-сборки — для тестов и staging, а не для продакшена. Некоторые команды гоняют с -race канареечные деплои на малом трафике, но стандарт — тесты и CI.
Вы узнаете:
- как устроены теневые слова детектора
- как детектор относится к атомикам
Проверьте себя
Гонка в редком маршруте живёт в проде годами, хотя в CI стоит -race. Почему?
Почему race-сборку не выкатывают в прод?
Какая цена race detector?
правильных ответов
-race: ловит data race на пройденных путях; логические гонки не видит; стоит ~10x времени и памяти. Инструмент тестов, не продакшена.
10 000 ₽ · 60 минут · онлайн