- Race-Condition
-
Dieser Artikel erläutert Race Condition in der Informatik, für die Race Condition in der Elektronik siehe Glitch (Elektronik). - Wert lesen: Der Wert wird aus dem externen Speicher in den internen Speicher gelesen.
- Wert erhöhen: Der Wert wird im internen Speicher um 1 erhöht.
- Wert schreiben: Der Wert aus dem internen Speicher zurück in den externen Speicher geschrieben.
- Deadlock
- Semaphor
- Transaktion
- Schreib-Lese-Konflikt (auch Dirty Read)
- Verlorene Updates (auch Lost Update)
Als Race Condition oder Race Hazard (deutsch: Wettlaufsituation) werden in der Programmierung Konstellationen bezeichnet, in denen das Ergebnis einer Operation vom zeitlichen Verhalten bestimmter Einzeloperationen abhängt.
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 zu einem völligen Verschwinden der Symptome führen können. Zur Vermeidung solcher Konstellationen können bei der Programmerstellung beispielsweise Semaphoren eingesetzt werden.
Beispiel
Zwei gleichzeitig laufende Systeme wollen denselben Wert erhöhen. Die notwendigen Einzelschritte, die jedes der beiden Systeme durchlaufen muss, sind:
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 | Sperrungen vor anderen Zugriffen (falls dies nicht möglich ist warten) |
1 | |
2 | Einlesen des Wertes Wert: 1 |
1 | Sperrungen vor anderen Zugriffen (falls dies nicht möglich ist 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 | Sperrungen vor anderen Zugriffen (Nun erfolgt die eigentliche Sperrung) |
6 | 2 | Einlesen des Wertes Wert: 2 |
|
7 | 2 | Erhöhen des internen Wertes um eins Wert: 3 |
|
8 | 3 | Speichern des Wertes |
Siehe auch
Wikimedia Foundation.