Es ist schwierig zu beweisen, dass ein Programm "threadsicher" ist. Es ist jedoch möglich, den Begriff "Datenrennen" konkret und formal zu definieren. Außerdem kann festgestellt werden, ob eine Ausführungsablaufverfolgung eines bestimmten Programmlaufs zeitlich proportional zur Größe der Ablaufverfolgung ein Datenrennen aufweist oder nicht. Diese Art der Analyse reicht mindestens bis 1988 zurück: Barton P. Miller, Jong-Deok Choi, "Ein Mechanismus zum effizienten Debuggen paralleler Programme", Conf. auf Prog. Lang. Dsgn. und Impl. (PLDI-1988): 135-144 .
Bei einem Trace einer Ausführung definieren wir zunächst eine Vor-Reihenfolge zwischen Ereignissen in dem Trace. Bei zwei Ereignissen und b , die im selben Thread auftreten, ist a < b oder b < a . (Die Ereignisse auf demselben Thread bilden eine Gesamtreihenfolge, die durch die sequentielle Semantik der Programmiersprache vorgegeben wird.) Synchronisationsereignisse (dies können beispielsweise Mutex-Erfassungen und -Freigaben sein) führen zu einem zusätzlichen Zwischen-Thread, der vor einer Teilreihenfolge auftritt. (Wenn Thread S einen Mutex freigibt und Thread T diesen Mutex abruft, sagen wir, dass die Freigabe erfolgt - vor dem Erwerb.)einba < bb < aS.T.
Bei zwei Datenzugriffen (Lesen oder Schreiben in Variablen, die keine Synchronisationsvariablen sind) und b , die sich auf demselben Speicherort befinden, aber von verschiedenen Threads stammen und bei denen entweder a oder b eine Schreiboperation ist, sagen wir, dass es eine Daten- gibt. Rennen zwischen a und b, wenn weder a < b noch b < a .einbeinbeinba < bb < a
Der C ++ 11-Standard ist ein gutes Beispiel. (Der relevante Abschnitt ist 1.10 in den online verfügbaren Entwurfsspezifikationen.) C ++ 11 unterscheidet zwischen Synchronisationsobjekten (Mutexe und mit einem atomic<>
Typ deklarierte Variablen ) und allen anderen Daten. Die C ++ 11-Spezifikation besagt, dass der Programmierer über die Datenzugriffe in einer Spur eines Multithread-Programms argumentieren kann, als ob sie sequentiell konsistent wären, wenn die Datenzugriffe alle datenrennfrei sind.
Das Helgrind-Tool (Teil von Valgrind) führt diese Art der datenbasierten Erkennung durch, bevor mehrere kommerzielle Tools (z. B. Intel Inspector XE) verwendet werden. Die Algorithmen in modernen Tools basieren darauf, dass Vektoruhren mit jedem Thread und jeder Synchronisation verknüpft bleiben Objekt. Ich denke, diese Technik der Verwendung von Vektoruhren zur Erkennung von Datenrennen wurde von Michiel Ronsse entwickelt. Koen De Bosschere: "RecPlay: ein vollständig integriertes praktisches Aufzeichnungs- / Wiedergabesystem", ACM Trans. Comput. Syst. 17 (2): 133-152, 1999 .