2012-04-03 11 views
1

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?

+0

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). –

+0

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. –

Antwort

1

Es kann nicht garantiert werden, dass der Thread bei Signalisierung sofort ausgeführt wird. Es wird nur als "bereit" markiert und wird dem Systemplaner ausgeliefert. Zwischen dieser Zeit wird es planbar und die Zeit ist tatsächlich geplant, ein anderer Thread könnte die zugrunde liegende Bedingung geändert haben.

Zum Beispiel:

Thema A: Warten auf Bedingung variabel.

Thread B: Aktualisierungsstatus. Signalbedingungsvariable.

Thema C: Reset-Zustand

Thema A: Wake. Überprüfen Sie den zugrunde liegenden Zustand, es ist unverändert.

+0

Dies ist kein ungewolltes Aufwecken - der Condvar wurde signalisiert. Aus dem Wiki: "Einer dieser Gründe ist ein falsches Aufwachen; das heißt, ein Thread könnte aufgeweckt werden, obwohl kein Thread den Zustand signalisierte. ' Dies ist, IMHO, eine andere Art zu sagen, dass 'condvars' unter Unix/Linux nicht korrekt funktioniert und ein Fix im Benutzercode angewendet werden muss. Glücklicherweise wird dies durch das Design von Condvars abgedeckt, was bedeutet, dass ohnehin ein Looping-Check durchgeführt werden muss ". –