Ich verstehe, dass pthread_cond_wait() dokumentiert ist, um falsche Wake-ups zu bekommen, und der Aufrufer muss nach dieser Bedingung suchen, und die Motivation dafür ist, Implementierungen von pthread_cond_wait() zu ermöglichen, um eine bessere Leistung zu erreichen und den Aufrufer zu zwingen, robuster zu erstellen Code.Warum erlaubt es pthread_cond_wait() manchmal, ein falsches Wakeup zu erhalten, um die Leistung zu verbessern?
Allerdings habe ich niemanden gesehen, der über die Leistungschance, die dies bietet, abgesehen von der Erwähnung von Rennbedingungen, die teuer zu vermeiden wären, spezifisch wird.
Kann jemand bitte ins Detail gehen, welche Race-Bedingungen entstehen würden, um sicherzustellen, dass es keine unechten Weckrufe gibt und welche Hardware-Architekturen solche Szenarien verursachen würden?
Es stellt sich heraus, die wahre Motivation war anscheinend Benutzer zu zwingen, das Prädikat in einer Schleife zu überprüfen - die möglichen Leistungsvorteile scheinen etwas sekundär gewesen zu sein: http://StackOverflow.com/a/8594644/12711 Aber hier ist ein Fehlerbericht, der darauf hinweist, dass NPTL möglicherweise einen Fehler verursacht, indem er versucht, * unechte Wakeups * zu verhindern: http://sourceware.org/bugzilla/show_bug.cgi?id=13165#c13 Ich präsentiere dies nur als Kommentar, weil ich nicht weiß, Ich weiß, ob der Fehlerbericht gültig ist oder nicht (Rennen sind komplexe Dinge). –
Ich denke, es ist umgekehrt. Es ist verständlich, dass das Prädikat erneut überprüft werden sollte, da der Condvar keinen Zustand hat (im Gegensatz zu Semaphoren). Diese Prüfschleife deckt alle unerwünschten Wakeups ab, die auftreten, selbst wenn der Condvar nicht signalisiert wurde. –