For the complete documentation index, see llms.txt. This page is also available as Markdown.

Exkurs: Spurious Wakeups

Spurious Wakeups (auf deutsch: scheinbare oder unbegründete Aktivbierung) kommen bei Threads und Condition Variables vor.

Idee: Ein Thread kann aus dem Warten aufwachen, ohne dass jemand ihn absichtlich geweckt hat und ohne dass die Bedingung erfüllt ist.

Einfaches Beispiel

Ein Thread wartet:

wait(condition);

Er wacht auf - aber die Bedingung ist noch falsch.

Warum passiert das?

  • Betriebssystem-Optimierungen

  • Mehrere Threads werden gleichzeitig geweckt

  • Implementierungsdetails der Synchronisation

Wichtig: Das ist kein Fehler, sondern erlaubt!

Konsequenz (Merksatz)

Nach dem Aufwachen immer prüfen, ob die Bedingung wirklich gilt.

Darum schreibt man:

while (!logicalCondition) { // logische Bedingung
  wait(wakeUpCondition);    // Synchronisationsmechanismus, zusammen mit einem Mutex
}

Hinweis:

Da dies verwirrend sein kann:

  • logicalCondition → logische Bedingung im Programm (z. B. buffer_not_empty)

  • wakeUpCondition → Conditional Variable, nur ein Weckmechanismus, funktioniert nur zusammen mit einem Mutex

Daher: Ein spurious wakeup ist ein unerwartetes Aufwachen eines Threads - deshalb nie if, immer while beim Warten verwenden.

Last updated