Wikipedia · einfach zusammengefasst · Stand
Wettlaufsituation
Eine Wettlaufsituation, aus dem Englischen auch Race Condition (deutsch Wettlauf-Bedingung) oder Race Hazard (deutsch Wettlauf-Risiko), mitunter auch …
Inhalt3 Abschnitte
Definition und Bedeutung
Eine Wettlaufsituation, auch Race Condition, Wettlauf-Bedingung, Race Hazard oder Wettlauf-Risiko genannt, liegt in der Programmierung vor, wenn das Ergebnis einer Operation vom zeitlichen Ablauf einzelner Operationen oder von der Umgebung abhängt. Treffen mehrere Abläufe auf gemeinsam genutzte Daten zu, kann ihre Ausführungsreihenfolge also das Ergebnis verändern.
Unbeabsichtigte Wettlaufsituationen sollten vermieden werden. Sie verursachen häufig nichtdeterministische Programmfehler: Derselbe Programmablauf kann unter scheinbar gleichen Bedingungen unterschiedliche Ergebnisse liefern. Solche Fehler sind schwer zu finden, weil veränderte Testbedingungen – etwa zusätzliches Logging oder ein Debug-Modus – die Symptome vollständig verschwinden lassen können. Ein derartiges Verhalten wird auch als Heisenbug bezeichnet.
Gleichzeitiges Erhöhen eines Wertes
Zwei gleichzeitig laufende Systeme A und B wollen denselben gespeicherten Wert erhöhen. Jedes System führt dazu drei Einzelschritte aus:
- Wert lesen: Der Wert wird aus dem externen in den internen Speicher übernommen.
- Wert erhöhen: Der interne Wert wird um 1 erhöht.
- Wert schreiben: Der interne Wert wird in den externen Speicher zurückgeschrieben.
Der Anfangswert ist 1. Arbeiten A und B nacheinander, liest A die 1, erhöht sie auf 2 und speichert sie. Danach liest B die 2, erhöht sie auf 3 und speichert sie. Das erwartete Endergebnis ist 3.
Bei gleichzeitiger Ausführung können jedoch beide Systeme zunächst den Wert 1 lesen. Anschließend erhöhen beide ihren jeweiligen internen Wert auf 2 und schreiben jeweils 2 zurück. Dadurch beträgt der gespeicherte Endwert nur 2 statt 3: Eine der beiden Erhöhungen geht verloren.
Vermeidung durch Sperrung
Das Problem lässt sich vermeiden, indem System A den Zugriff auf den gemeinsam genutzten Wert bis zum Abschluss seiner Änderung sperrt. System B kann die Sperrung währenddessen nicht erhalten und muss warten.
A sperrt den Zugriff, liest den Wert 1, erhöht ihn auf 2, schreibt ihn zurück und hebt die Sperre auf. Erst danach erhält B Zugriff, liest den Wert 2, erhöht ihn auf 3, speichert ihn und gibt die Sperre wieder frei. So entsteht zuverlässig der erwartete Endwert 3.
Zur Vermeidung solcher Wettlaufsituationen können beispielsweise Semaphore eingesetzt werden. Sie steuern den Zugriff mehrerer gleichzeitig laufender Systeme auf gemeinsam genutzte Ressourcen.
Lernvideos zu Wettlaufsituation
6:54
Race Conditions and How to Prevent Them - A Look at Dekker's Algorithm
Spanning Tree · 247.760 Aufrufe
6:32
Multithreading in C++ [010] - Race Conditions
Brotcrunsher · 2.674 Aufrufe
2:09
What is a Race Condition (Computer Programming)?
Eye on Tech · 69.427 Aufrufe
2:30
Operating systems - Critical sections
Alon Lalezari - אלון ללזרי · 276 Aufrufe