Eine "Race Condition" liegt vor, wenn Multithreading- (oder anderweitig paralleler) Code, der auf eine gemeinsam genutzte Ressource zugreift, unerwartete Ergebnisse hervorrufen könnte.
Nehmen Sie dieses Beispiel:
for ( int i = 0; i < 10000000; i++ )
{
x = x + 1;
}
Wenn Sie 5 Threads hätten, die diesen Code gleichzeitig ausführen, würde der Wert von x NICHT 50.000.000 betragen. Er würde vielmehr bei jedem Durchlauf variieren.
Das liegt daran, dass jeder Thread, um den Wert von x zu erhöhen, Folgendes tun muss: (natürlich vereinfacht)
Retrieve the value of x
Add 1 to this value
Store this value to x
Jeder Thread kann sich jederzeit in einem beliebigen Schritt dieses Prozesses befinden, und sie können sich gegenseitig beeinflussen, wenn eine gemeinsame Ressource betroffen ist. Der Zustand von x kann von einem anderen Thread in der Zeit zwischen dem Lesen und dem Zurückschreiben von x geändert werden.
Angenommen, ein Thread ruft den Wert von x ab, hat ihn aber noch nicht gespeichert. Ein anderer Thread kann auch den dieselbe Wert von x (weil ihn noch kein Thread geändert hat) und dann würden beide den dieselbe Wert (x+1) zurück in x!
Beispiel:
Thread 1: reads x, value is 7
Thread 1: add 1 to x, value is now 8
Thread 2: reads x, **value is 7**
Thread 1: stores 8 in x
Thread 2: adds 1 to x, value is now 8
Thread 2: **stores 8 in x**
Race-Bedingungen können vermieden werden, indem man eine Art von Verriegelung Mechanismus vor dem Code, der auf die gemeinsame Ressource zugreift:
for ( int i = 0; i < 10000000; i++ )
{
//lock x
x = x + 1;
//unlock x
}
Hier lautet die Antwort jedes Mal 50.000.000.
Weitere Informationen zum Thema Sperren finden Sie unter: mutex, semaphore, critical section, shared resource.
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 )