Race Condition

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Dieser Artikel erläutert Race Condition in der Informatik, für die Race Condition in der Elektronik siehe Glitch (Elektronik).

Ein kritischer Wettlauf, auch Wettlaufsituation (englisch race condition oder race hazard) ist in der Programmierung eine Konstellation, in der das Ergebnis einer Operation vom zeitlichen Verhalten bestimmter Einzeloperationen abhängt. Im Allgemeinen ist die Möglichkeit, dass eine Race Condition entsteht, zu vermeiden.

Unbeabsichtigte Wettlaufsituationen sind ein häufiger Grund für schwer auffindbare Programmfehler; bezeichnend für solche Situationen ist nämlich, dass bereits die veränderten Bedingungen zum Programmtest, wie zusätzliches Logging oder Debug-Modus, zu einem völligen Verschwinden der Symptome führen können. Zur Vermeidung solcher Konstellationen können bei der Programmerstellung beispielsweise Semaphore eingesetzt werden.

Beispiel[Bearbeiten]

Zwei gleichzeitig laufende Systeme wollen denselben Wert erhöhen. Die notwendigen Einzelschritte, die jedes der beiden Systeme durchlaufen muss, sind:

  1. Wert lesen: Der Wert wird aus dem externen Speicher in den internen Speicher gelesen.
  2. Wert erhöhen: Der Wert wird im internen Speicher um 1 erhöht.
  3. Wert schreiben: Der Wert wird aus dem internen Speicher zurück in den externen Speicher geschrieben.

Angenommen, der Wert betrage anfangs 1. Das erste System heißt „A“, das zweite System „B“. Erhöhen beide Systeme den Wert, ist der erwartete neue Wert 3. Wenn System A zeitlich vor System B arbeitet, wird das auch so sein:

Zeitpunkt System A Gespeicherter Wert System B
1 Einlesen des Wertes
Wert: 1
1
2 Erhöhen des internen Wertes um eins
Wert: 2
1
3 Speichern des Wertes 2
4 2 Einlesen des Wertes
Wert: 2
5 2 Erhöhen des internen Wertes um eins
Wert: 3
6 3 Speichern des Wertes

Arbeiten beide Systeme gleichzeitig und ist die Reihenfolge der Befehle unbestimmt, kann die Wettlaufsituation jedoch dazu führen, dass der tatsächlich erhaltene, neue Wert stattdessen 2 beträgt:

Zeitpunkt System A Gespeicherter Wert System B
1 Einlesen des Wertes
Wert: 1
1 Einlesen des Wertes
Wert: 1
2 Erhöhen des internen Wertes um eins
Wert: 2
1 Erhöhen des internen Wertes um eins
Wert: 2
3 Speichern des Wertes 2 Speichern des Wertes

Zur Vermeidung des Problems müsste A den Zugriff auf den Wert bis zum Abschluss der Veränderung so sperren, dass B warten muss, bis A seinen Zugriff auf den Wert beendet hat.

Zeitpunkt System A Gespeicherter Wert System B
1 Sperrung gegen fremde Zugriffe
(falls dies nicht möglich ist: warten)
1
2 Einlesen des Wertes
Wert: 1
1 Versuch: Sperrung gegen fremde Zugriffe
(da nicht möglich: warten)
3 Erhöhen des internen Wertes um eins
Wert: 2
1 Auf Freigabe warten...
4 Speichern des Wertes 2 Auf Freigabe warten...
5 Aufheben der Sperrung 2 Sperrung gegen fremde Zugriffe
(nun erfolgreich)
6 2 Einlesen des Wertes
Wert: 2
7 2 Erhöhen des internen Wertes um eins
Wert: 3
8 3 Speichern des Wertes
9 3 Aufheben der Sperrung

Siehe auch[Bearbeiten]