Race Conditions treten in Multi-Thread-Anwendungen oder Multiprozesssystemen auf. Eine Race Condition ist im Grunde alles, was davon ausgeht, dass zwei Dinge, die sich nicht im selben Thread oder Prozess befinden, in einer bestimmten Reihenfolge ablaufen, ohne dass Maßnahmen ergriffen werden, um sicherzustellen, dass dies der Fall ist. Dies geschieht häufig, wenn zwei Threads Nachrichten weitergeben, indem sie Mitgliedsvariablen einer Klasse setzen und überprüfen, auf die beide zugreifen können. Es gibt fast immer eine Wettlaufsituation, wenn ein Thread sleep aufruft, um einem anderen Thread Zeit zu geben, eine Aufgabe zu beenden (es sei denn, dieser sleep befindet sich in einer Schleife mit einem Prüfmechanismus).
Werkzeuge zur Verhinderung von Wettlaufsituationen sind von der Sprache und dem Betriebssystem abhängig, aber einige gängige sind Mutexe, kritische Abschnitte und Signale. Mutexe sind gut, wenn Sie sicherstellen wollen, dass Sie der Einzige sind, der etwas tut. Signale sind gut, wenn Sie sicherstellen wollen, dass jemand anderes etwas zu Ende gebracht hat. Eine Minimierung der gemeinsam genutzten Ressourcen kann auch dazu beitragen, unerwartetes Verhalten zu verhindern
Die Erkennung von Rennbedingungen kann schwierig sein, aber es gibt einige Anzeichen. Code, der sich stark auf Schlafphasen stützt, ist anfällig für Race Conditions, also prüfen Sie zunächst, ob der betroffene Code Aufrufe zum Schlafen enthält. Das Hinzufügen besonders langer Schlafphasen kann auch zur Fehlersuche verwendet werden, um eine bestimmte Reihenfolge von Ereignissen zu erzwingen. Dies kann nützlich sein, um das Verhalten zu reproduzieren und zu sehen, ob man es durch Änderung des Timings zum Verschwinden bringen kann, und um eingeführte Lösungen zu testen. Nach der Fehlersuche sollten die Schlafphasen wieder entfernt werden.
Ein Anzeichen für eine Wettlaufbedingung ist jedoch, wenn ein Problem nur auf einigen Rechnern sporadisch auftritt. Häufige Fehler sind Abstürze und Deadlocks. Mit Hilfe der Protokollierung sollten Sie in der Lage sein, den betroffenen Bereich zu finden und von dort aus weiterzuarbeiten.
10 Stimmen
Ich möchte darauf hinweisen, dass - ohne Angabe der Sprache - die meisten Teile dieser Frage nicht richtig beantwortet werden können, da die Definition, die Folgen und die Instrumente zu ihrer Verhinderung in den verschiedenen Sprachen unterschiedlich sein können.
0 Stimmen
@MikeMB. Einverstanden, außer bei der Analyse der Ausführung von Bytecode, wie sie von Race Catcher durchgeführt wird (siehe diesen Thread stackoverflow.com/a/29361427/1363844 ) können wir all die etwa 62 Sprachen ansprechen, die sich zu Bytecode kompilieren lassen (siehe de.wikipedia.org/wiki/Liste_der_JVM_Sprachen )