Multicore und Synchronisation
Warum wird beim Warten mit einer Bedingungsvariable auf „Warteschlange nicht mehr leer“ die Bedingung nach dem Aufwachen mit einer while-Schleife statt mit if erneut geprüft?
- AWeil while schneller als if ausgeführt wird
- BWeil if bei Bedingungsvariablen nicht verwendet werden darf
- CWeil die Bedingung auch nach dem Aufwecken nicht erfüllt sein kann, etwa weil ein anderer Thread zuvor zugegriffen hat oder das Aufwachen grundlos erfolgt ist
Antwort und Erläuterung anzeigen
Antwort: C. Weil die Bedingung auch nach dem Aufwecken nicht erfüllt sein kann, etwa weil ein anderer Thread zuvor zugegriffen hat oder das Aufwachen grundlos erfolgt ist
Beim Warten auf eine Bedingungsvariable wird die Sperre abgegeben und geschlafen, und nach der Benachrichtigung wird beim Aufwachen die Sperre wieder erworben und zurückgekehrt. In der Zeit bis zum Aufwachen kann jedoch ein anderer Thread die Sperre zuerst erwerben und das Element der Warteschlange entnehmen. Außerdem ist es aus Implementierungsgründen zulässig, auch ohne Benachrichtigung aufzuwachen (Spurious Wakeup). Daher wird die Bedingung nach dem Aufwachen geprüft und, falls nicht erfüllt, erneut gewartet, geschrieben als while-Schleife.