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?
Danke. Irgendeine Idee, warum bedingte Variablen anfällig für unechte Wakeups sind, während Events dieses Problem nicht haben? –
@ 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. –