2016-08-04 53 views
4

Die MSDN-Seite für SleepConditionVariableCS besagt, dassWartet auf ein Ereignis, das durch falsche Wakeups verursacht wird?

Bedingungsvariablen zu falschen Wakeups unterliegen (die nicht mit einer expliziten Folge verbunden sind) und gestohlene Wakeups (ein anderer Thread schafft vor dem aufgeweckt Thread ausgeführt). Daher sollten Sie ein Prädikat (in der Regel in einer While-Schleife) erneut überprüfen, nachdem eine Schlafoperation zurückgibt.

Als Ergebnis der bedingte Warte hat in einer while-Schleife eingeschlossen werden, dh

while (check_predicate()) 
{ 
    SleepConditionVariableCS(...) 
} 

Wenn ich events statt Bedingungsvariablen verwenden waren kann ich mit der while-Schleife tun, weg während des Wartens (WaitForSingleObject) für das Ereignis signalisiert werden?

Antwort

7

Für WaitForSingleObject() gibt es keine unechten Wakeups, so dass Sie die Schleife beseitigen können.

Wenn Sie WaitForMultipleObjectsEx() mit bAlertable=TRUE verwenden, MsgWaitForMultipleObjects() mit einer Wake-Maske, oder MsgWaitForMultipleObjectsEx() mit bAlertable=TRUE oder einer Wake-Maske, dann kann das Warten auf anderen Bedingungen beenden, bevor das Ereignis tatsächlich signalisiert wird.

+0

Danke. Irgendeine Idee, warum bedingte Variablen anfällig für unechte Wakeups sind, während Events dieses Problem nicht haben? –

+1

@ work.bin: Es ist nur die Art und Weise, wie Zustandsvariablen im Allgemeinen funktionieren. Es ist auch nicht auf die Implementierung von Microsoft beschränkt. [pthreads leidet darunter] (http://stackoverflow.com/questions/8594591/), [so tut STL] (http://en.cppreference.com/w/cpp/thread/condition_variable), und [Boost, auch] (http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref). Was * WHY * betrifft, sind Zustandsvariablen * Benutzermodus * -Objekte, wohingegen Ereignisse * Kernel * -Objekte sind. Der Kernel hat keine ungewollten Wakes, aber der User-Modus kann, abhängig von der Thread-Planung und so weiter. –