Bugs: Race Condition

Der Ausdruck „Race Condition“ wird verwendet, um einen Zustand zu bezeichnen, in dem mehrere Prozesse eines Systems parallel ablaufen, wobei die strikte Einhaltung einer bestimmten Reihenfolge der Schritte erwartet wird, aber aufgrund mangelnder Koordination zwischen den Einheiten nicht garantiert werden kann. Dies führt häufig zu unvorhersehbarem Verhalten und falschen Ergebnissen.

Beispiel

Zwei gleichzeitige Prozesse müssen denselben Wert inkrementieren, der nur in einer Operation (Schritt) abgerufen oder gespeichert werden kann.

SchrittProzess AGemeinsame WertProzess B
1Abrufen
[Interner Wert: 0]
0Abrufen
[Internal Value: 0]
2Inkrementieren
[Interner Wert: 1]
0Inkrementieren
[Interner Wert: 1]
3Speichern1Speichern

Da keiner der beiden Prozesse wusste, dass der gemeinsame Wert an anderer Stelle manipuliert wurde, wurde nur eine der Operationen erfolgreich durchgeführt, während der Beitrag des anderen überschrieben wurde. Stell dir vor, die Prozesse A und B seien Konzertbesucher, die Tickets für ihre Lieblingsband buchen und der gemeinsame Wert steht für die Anzahl der verfügbaren Plätze. Nehmen wir an, es sei nur noch eine Karte übrig, aber beide buchen gleichzeitig, oder noch schlimmer, dasselbe passiert mit Dutzenden von Paaren.

Verbesserung

Um den Bug zu beseitigen, bietet sich ein Synchronisationsmechanismus einzubauen, wie z.B. einen Mutex Lock (siehe unteres Beispiel).

SchrittProzess AGemeinsame WertProzess B
1Wert gegen äußere Einflüsse sperren0
2Abrufen
[Interner Wert: 0]
0Wert versuchen zu sperren
=> Fehlgeschlagen
3Inkrementieren
[Interner Wert: 1]
0Auf Erhebung der Sperre warten...
4Sperrung lösen1Auf Erhebung der Sperre warten...
51Lock value
61Abrufen
[Interner Wert: 1]
71Inkrementieren
[Interner Wert: 2]
82Speichern
92Sperrung lösen