3 SynchronisationRace Conditions

Race Conditions

Auf einen Blick

Eine Race Condition liegt vor, wenn das Ergebnis einer Aktion nichtdeterministisch vom zeitlichen Verhalten anderer Prozesse abhängt. Voraussetzung: ein Prozess muss durch einen anderen „störbar" sein (z.B. durch Unterbrechung).

Definition

Das Ergebnis einer Aktion eines Prozesses hängt nichtdeterministisch vom zeitlichen Verhalten anderer Prozesse ab.

Voraussetzungen:

  • ein Prozess muss durch einen anderen „störbar" sein,
  • Beispiel einer Störung: die Unterbrechung durch einen anderen Prozess (Kontextwechsel mitten in einer Operation).

Das verlorene Update — interaktiv

Schon ein simples anzahl++ ist nicht atomar (lesen → rechnen → schreiben). Wird mitten drin unterbrochen, geht ein Update verloren:

race-condition.html

Das Mailbox-Beispiel (Producer/Consumer)

Ein Puffer fester Größe, ein Schreiber (Producer) und ein Leser (Consumer), gekoppelt über eine globale Variable anzahl:

void schreiber(){ if(anzahl==MAX) sleep(); anzahl++; write(item); if(anzahl==1) wake(leser); }
void leser()   { if(anzahl==0)   sleep(); anzahl--; read(item);  if(anzahl==MAX-1) wake(schreiber); }

Zwei Tücken:

  1. Wird der Leser während anzahl-- vom Schreiber (anzahl++) unterbrochen, kann ein Eintrag überschrieben werden.
  2. Wird bei anzahl==0 der Leser vor dem sleep() unterbrochen, kann das wake() des Schreibers verloren gehen — am Ende schlafen beide dauerhaft.

Folgerung: Manche Code-Strecken dürfen nicht unterbrochen werden, insbesondere der Zugriff auf gemeinsame Daten → der kritische Abschnitt.

Verwandte Notes

Kritischer Abschnitt & Mutual Exclusion · Spinlocks · Semaphoren · Prozess-Kommunikation

← Kapitelübersicht


⬅️ Prozess-Kommunikation · Kritischer Abschnitt & Mutual Exclusion ➡️

Built with LogoFlowershow