Довести, що програма є "безпечною для потоків", важко. Однак можна конкретно і формально визначити термін "перегони даних". І можна визначити, чи відповідає траєкторія виконання певного запуску програми чи не має гонки даних у часі, пропорційній розміру траси. Цей тип аналізу сягає щонайменше до 1988 року: Бартон П. Міллер, Джонг-Дек Чой, "Механізм ефективної налагодження паралельних програм", конф. на Прог. Ланг. Dsgn. та Імпл. (PLDI-1988): 135-144 .
З огляду на слід виконання, ми спочатку визначаємо події, що відбуваються перед частковим порядком між подіями в трасі. Враховуючи дві події і які відбуваються в одній нитці, тоді або . (Події одного і того ж потоку утворюють загальний порядок, заданий послідовною семантикою мови програмування.) Події синхронізації (наприклад, вони можуть набувати і випускати mutex, наприклад, дають додатковий міжрядковий потік - перед частковим порядком. (Якщо потік випускає мутекс, а потім нитка набуває цього мутексу, ми кажемо, що випуск відбувається перед придбанням.)абa < bб < аSТ
Тоді, задавши два доступу до даних (читає або записує до змінних, які не є змінними синхронізації) і які знаходяться в одному і тому самому місці пам'яті, але різними потоками, і де або або - операція запису, ми кажемо, що є дані- гонка між і якщо ні ні .абабaba<bb<a
Стандарт C ++ 11 - хороший приклад. (Відповідний розділ 1.10 у проектах специфікацій, доступних в Інтернеті.) C ++ 11 розрізняє об’єкти синхронізації (мутекси та змінні, оголошені з atomic<>
типом), та всі інші дані. Специфікація C ++ 11 говорить, що програміст може міркувати про доступ до даних на сліді багатопотокової програми так, як ніби вони послідовно послідовні, якщо доступ до даних не є вільним до перегонів даних.
Інструмент Helgrind (частина Valgrind) виконує подібний тип виявлення, що відбувається раніше, ніж на основі даних, що базуються на даних, як і кілька комерційних інструментів (наприклад, Intel Inspector XE.) Алгоритми в сучасних інструментах засновані на збереженні векторних годин, пов'язаних з кожною ниткою та синхронізації об’єкт. Я думаю, що цю техніку використання векторних годин для виявлення перегонів даних запровадив Мічіель Ронс; Koen De Bosschere: "RecPlay: повністю інтегрована система практичного запису / повтору", ACM Trans. Обчислення. Сист. 17 (2): 133-152, 1999 .