ThreadSanitizer перестаёт находить гонки после 255 потоков
Фил Итон разбирает на The Consensus, что такое гонка данных, как устроен детектор гонок и какие баги есть у самого детектора. Внутри: идеализированный интерпретатор многопоточного C на Python и векторные часы в стиле FastTrack, на которых видно, как детектор сопоставляет обращения к памяти из разных потоков.
Рамка: TSan встроен почти во все тулчейны (Clang, GCC, Go, Swift, OCaml), но документации у него нет. Опубликован алгоритм второй версии (2012), а про третью (2021) автор предлагает читать исходники.
Дальше показано, как перегрузить внутренние структуры TSan, чтобы он молча пропустил очевидную гонку. Одна из границ: процесс, создавший за свою жизнь больше 255 потоков. Для Go-сервиса с горутиной на запрос это обычный день.
Сохраните, если полагаетесь на go test -race в CI: зелёный прогон не доказывает, что гонок нет.
Post #2995
378