Skip to content
8 / 15

Гонки данных: что ловит race detector и чего он не видит

Гонка данных — это когда две горутины обращаются к одной переменной, хотя бы одна из них пишет, и между обращениями нет отношения «происходит раньше». Результат не просто непредсказуем: программа с гонкой не имеет определённого поведения вообще, поэтому «работает же» ничего не доказывает. Go включает детектор гонок, включаемый флагом -race при сборке и тестах. Он не анализирует код статически, а следит за реальными обращениями во время выполнения — отсюда два его свойства. Он не даёт ложных срабатываний: если он сообщил о гонке, гонка есть. И он находит только то, что реально произошло в этом запуске: путь кода, который не выполнился, останется непроверенным. Плата — замедление в пять-десять раз и рост потребления памяти, поэтому -race включают в CI и на нагрузочном стенде, а не в проде. И отдельно: детектор ловит гонки данных, но не логические гонки вроде неверного порядка операций и не дедлоки.

Гонки данных: что ловит race detector и чего он не видит | JScriptiser