TL; DR Die Annahme ("Vertrag") von fehlerhaften Aufweckvorgängen ist eine sinnvolle architektonische Entscheidung, die getroffen wurde, um realistisch robuste Implementierungen von Thread-Sheduler zu ermöglichen.
"Leistungsüberlegungen" sind hier irrelevant, es handelt sich lediglich um Missverständnisse, die weit verbreitet wurden, weil sie in einem veröffentlichten maßgeblichen Verweis angegeben wurden. (Autoritative Verweise können Fehler enthalten, fragen Sie einfach Galileo Galilei. ) Der Wikipedia-Artikel behält den Verweis auf den von Ihnen zitierten Verweis bei, nur weil er perfekt zu den formalen Richtlinien zum Zitieren des veröffentlichten Verweises passt.
Viel zwingenderer Grund für die Einführung des Konzepts des falschen Aufwachens ist in dieser Antwort auf SO angegeben , die auf zusätzlichen Details basiert, die in einer (älteren Version) dieses Artikels bereitgestellt wurden:
Der Wikipedia- Artikel über falsches Aufwecken hat diesen Leckerbissen:
Die pthread_cond_wait()
Funktion unter Linux wird über den futex
Systemaufruf implementiert . Jeder blockierende Systemaufruf unter Linux kehrt abrupt mit zurück, EINTR
wenn der Prozess ein Signal empfängt. ... pthread_cond_wait()
kann das Warten nicht neu starten, da es in der kurzen Zeit außerhalb des futex
Systemaufrufs ein echtes Aufwecken verpassen kann ...
Denken Sie nur daran ... wie bei jedem Code kann es beim Thread-Scheduler zu einem vorübergehenden Blackout kommen, weil in der zugrunde liegenden Hardware / Software etwas Ungewöhnliches passiert. Natürlich sollte darauf geachtet werden, dass dies so selten wie möglich vorkommt, aber da es keine 100% robuste Software gibt, ist es vernünftig anzunehmen, dass dies passieren kann , und auf die ordnungsgemäße Wiederherstellung zu achten, falls der Scheduler dies erkennt (z. B. durch Beobachtung fehlender Herzschläge ).
Wie kann sich der Scheduler nun erholen, wenn man bedenkt, dass beim Blackout einige Signale fehlen können, die wartende Threads benachrichtigen sollen? Wenn der Scheduler nichts unternimmt, bleiben die genannten "unglücklichen" Threads hängen und warten für immer - um dies zu vermeiden, sendet der Scheduler einfach ein Signal an alle wartenden Threads.
Dies macht es notwendig, einen "Vertrag" abzuschließen, über den wartende Threads ohne Angabe von Gründen benachrichtigt werden können. Um genau zu sein, gibt es einen Grund - Scheduler-Blackout - aber da der Thread (aus gutem Grund) so konzipiert ist, dass er die internen Implementierungsdetails des Schedulers nicht berücksichtigt, ist es wahrscheinlich besser, diesen Grund als "falsch" zu kennzeichnen.
Aus Fadenperspektive ähnelt dies einem Postelschen Gesetz (auch bekannt als Robustheitsprinzip ).
Sei konservativ in dem, was du tust, sei liberal in dem, was du von anderen akzeptierst
Die Annahme von fälschlichen Aufweckvorgängen zwingt den Thread dazu, konservativ zu sein, was er tut : Bedingung bei Benachrichtigung anderer Threads festlegen und liberal, was er akzeptiert : Die Bedingung bei Rückkehr von wait prüfen und wait wiederholen, wenn sie noch nicht da ist.