Um die Manpage zu zitieren:
Bei Verwendung von Bedingungsvariablen gibt es immer ein boolesches Prädikat mit gemeinsam genutzten Variablen, die jeder Bedingungswartezeit zugeordnet sind. Dies ist der Fall, wenn der Thread fortgesetzt werden soll. Es können falsche Aufweckvorgänge mit den Funktionen pthread_cond_timedwait () oder pthread_cond_wait () auftreten. Da die Rückgabe von pthread_cond_timedwait () oder pthread_cond_wait () nichts über den Wert dieses Prädikats aussagt, sollte das Prädikat bei einer solchen Rückgabe neu bewertet werden.
So pthread_cond_wait
kann zurückkehren , auch wenn Sie es nicht signalisiert haben. Zumindest auf den ersten Blick scheint das ziemlich grausam. Es wäre wie eine Funktion, die zufällig den falschen Wert oder zufällig zurückgegeben hat, bevor sie tatsächlich eine richtige return-Anweisung erreicht hat. Es scheint ein großer Fehler zu sein. Aber die Tatsache, dass sie sich dafür entschieden haben, dies auf der Manpage zu dokumentieren, anstatt es zu korrigieren, scheint darauf hinzudeuten, dass es einen legitimen Grund gibt, warum pthread_cond_wait
sie falsch aufwachen. Vermutlich hat die Funktionsweise etwas Eigenes, das dazu beiträgt, dass dem nicht geholfen werden kann. Die Frage ist was.
Warum ist pthread_cond_wait
spuriously zurückkehren? Warum kann es nicht garantieren, dass es nur aufwacht, wenn es richtig signalisiert wurde? Kann jemand den Grund für sein falsches Verhalten erklären?
pthread_cond_(timed)wait
: "Wenn ein Signal geliefert wird ... setzt der Thread das Warten auf die Bedingungsvariable fort, als ob es wäre nicht unterbrochen, oder es wird aufgrund eines falschen Aufwachens Null zurückgegeben ". Andere Sperrfunktionen zeigen an, EINTR
wenn sie durch ein Signal unterbrochen werden (z. B. read
) oder fortgesetzt werden müssen (z pthread_mutex_lock
. B. ). Wenn es also keine anderen Gründe für ein falsches Aufwachen gäbe, pthread_cond_wait
hätte dies wie einer der beiden definiert werden können.