Trudno jest udowodnić, że program jest „wątkowo bezpieczny”. Możliwe jest jednak konkretne i formalne zdefiniowanie terminu „wyścig danych”. Możliwe jest określenie, czy ślad wykonania określonego uruchomienia programu ma wyścig danych w czasie proporcjonalnym do wielkości śledzenia. Ten rodzaj analizy sięga co najmniej 1988 roku: Barton P. Miller, Jong-Deok Choi, „Mechanizm skutecznego debugowania programów równoległych”, Conf. na Prog. Lang. Dsgn. i Impl. (PLDI-1988): 135-144 .
Biorąc pod uwagę ślad wykonania, najpierw definiujemy zdarzenie przed częściowym porządkiem między zdarzeniami w śladzie. Biorąc pod uwagę dwa wydarzeniaza i b które występują wtedy w tym samym wątku a < b lub b < a. (Zdarzenia w tym samym wątku tworzą całkowitą kolejność nadaną przez semantykę sekwencyjną języka programowania.) Zdarzenia synchronizacji (mogą to być na przykład mutex rejestrujące i zwalniające), dają dodatkowy interwątek przed częściowym uporządkowaniem. (Jeśli wątekS. uwalnia muteks, a następnie wątek T. nabywa ten muteks, który mówimy, że wydanie następuje - zanim przejdzie.)
Następnie dane dwa dostępu do danych (odczytuje lub zapisuje zmienne, które nie są zmiennymi synchronizacyjnymi)za i b które znajdują się w tej samej lokalizacji w pamięci, ale według różnych wątków i gdzie za lub b to operacja zapisu, o której mówimy, że pomiędzy nimi odbywa się wyścig danych za i b jeśli żaden a < b ani b < a.
Standard C ++ 11 jest dobrym przykładem. (Odpowiednia sekcja to 1.10 w specyfikacjach wersji roboczych dostępnych online). C ++ 11 rozróżnia obiekty synchronizacji (muteksy i zmienne zadeklarowane z atomic<>
typem) i wszystkie inne dane. Specyfikacja C ++ 11 mówi, że programista może uzasadnić dostęp do danych na podstawie śladu programu wielowątkowego, tak jakby był sekwencyjnie spójny, jeśli dostęp do danych jest wolny od wyścigu danych.
Narzędzie Helgrind (część Valgrind) wykonuje tego rodzaju wykrywanie oparte na danych zdarzeniowych, podobnie jak kilka komercyjnych narzędzi (np. Intel Inspector XE). Algorytmy w nowoczesnych narzędziach polegają na utrzymywaniu zegarów wektorowych związanych z każdym wątkiem i synchronizacją obiekt. Myślę, że tę technikę wykorzystania zegarów wektorowych do wykrywania wyścigów danych zapoczątkował Michiel Ronsse; Koen De Bosschere: „RecPlay: w pełni zintegrowany praktyczny system nagrywania / odtwarzania”, ACM Trans. Comput. Syst. 17 (2): 133–152, 1999 .