Zum Inhalt springen
L

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
  1. 1. Definition und Bedeutung
  2. 2. Gleichzeitiges Erhöhen eines Wertes
  3. 3. Vermeidung durch Sperrung

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

Weiterlesen