Материал проходит вычитку — возможны неточности.
Урок 105 из 118

Границы и цена -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.

В следующем уроке

Вы узнаете:

  • как устроены теневые слова детектора
  • как детектор относится к атомикам
Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Гонка в редком маршруте живёт в проде годами, хотя в CI стоит -race. Почему?

Вопрос 2 из 3

Почему race-сборку не выкатывают в прод?

Вопрос 3 из 3

Какая цена race detector?

Итоги

-race: ловит data race на пройденных путях; логические гонки не видит; стоит ~10x времени и памяти. Инструмент тестов, не продакшена.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки