Определение потоковых небезопасных структур данных, используемых разными потоками одновременно - PullRequest
0 голосов
/ 22 мая 2019

Существует устаревший проект, который содержит сотни тысяч SLOC и выполняет много разных потоков.

Есть структура данных, которая содержит неатомарный элемент, который теоретически может использоваться разными потоками, ноиз-за высокой сложности кода может быть трудно идентифицировать этот случай из простого анализа кода.

Времена не всегда вызывают сбой, но это может произойти (например, этот элемент использует кучу).

Есть ли способ идентифицировать такие переменные или, например, во время тестирования вызвать сбой приложения при первом доступе к этой переменной потоком, который отличается от потока, который обращался к ней ранее?

1 Ответ

1 голос
/ 22 мая 2019

Вы можете попробовать использовать clang++ с ThreadSanitizer .Это включает в себя перекомпиляцию вашего кода с -fsanitize=thread -ltsan и его выполнение.TSan должен обнаруживать гонки данных и давать вам трассировки стека, чтобы выяснить, что их вызывает.

ThreadSanitizer - это инструмент, который обнаруживает гонки данных.Он состоит из инструментария компилятора и библиотеки времени выполнения.Типичное замедление, представленное ThreadSanitizer, составляет примерно 5x-15x.Типичные накладные расходы памяти, представленные ThreadSanitizer, составляют примерно 5x-10x.

...