Exkurs: Spurious Wakeups
Last updated
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.
Ein Thread wartet:
wait(condition);Er wacht auf - aber die Bedingung ist noch falsch.
Betriebssystem-Optimierungen
Mehrere Threads werden gleichzeitig geweckt
Implementierungsdetails der Synchronisation
Wichtig: Das ist kein Fehler, sondern erlaubt!
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
}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