Доказать, что программа является «поточно-ориентированной», сложно. Однако можно конкретно и формально определить термин «гонка данных». И можно определить, имеет ли трасса выполнения определенного запуска программы или нет гонку данных во времени, пропорциональную размеру трассы. Этот тип анализа восходит по крайней мере к 1988 году: Бартон П. Миллер, Чон-Деок Чой, «Механизм эффективной отладки параллельных программ», Conf. на прог. Lang. Dsgn. и импл. (PLDI-1988): 135-144 .
aба < бб < аST
aбaбaба < бб < а
Стандарт C ++ 11 является хорошим примером. (Соответствующий раздел - 1.10 в черновиках спецификаций, которые доступны онлайн.) В C ++ 11 проводится различие между объектами синхронизации (мьютексами и переменными, объявленными с atomic<>
типом) и всеми другими данными. Спецификация C ++ 11 говорит, что программист может рассуждать о доступе к данным на трассе многопоточной программы, как если бы она была последовательно последовательной, если доступ к данным свободен от гонки данных.
Инструмент Helgrind (входит в Valgrind) выполняет такое обнаружение данных на основе данных, которое происходит раньше, как и некоторые коммерческие инструменты (например, Intel Inspector XE). Алгоритмы в современных инструментах основаны на сохранении векторных часов, связанных с каждым потоком, и синхронизации объект. Я думаю, что эта методика использования векторных часов для обнаружения гонки данных была впервые разработана Michiel Ronsse; Коэн Де Босшере: «RecPlay: полностью интегрированная практическая система записи / воспроизведения», ACM Trans. Вычи. Сист. 17 (2): 133-152, 1999 .