2016-08-06 3 views
0

In PThreads, wenn eine bedingte Variable signalisiert wird und keine Threads blockieren auf pthread_cond_wait(), dann ist dieses Signal verloren.Bleibt der signalisierte Zustand einer CONDITIONAL_VARIABLE bestehen, auch wenn keine Threads auf dieses Signal warten?

Wenn Sie SetEvent() verwenden, um ein Ereignis in Windows zu signalisieren, bleibt dieses Ereignis im signalisierten Status, bis ein anderes Thread auf dieses Ereignisobjekt wartet.

Welche der oben genannten Verhaltensweisen werden mit CONDITIONAL_VARIABLEs unter Verwendung von WakeConditionVariable() signalisiert?

+1

Es spielt keine Rolle, da das [intended usage pattern] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682052 (v = vs.85) .aspx) zu verifizieren ist der Zustand vor dem Warten. Wenn die Bedingungsvariable aktiviert wird, wenn keine Kellner vorhanden sind, überprüft der nächste Kellner die Bedingung, stellt sicher, dass sie erfüllt ist, und ruft niemals 'SleepConditionVariable' an erster Stelle auf. –

Antwort

0

Aus dem folgenden Satz auf MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/ms687080(v=vs.85).aspx)

Waking einen Thread ist ähnlich wie ein Auto-Reset-Ereignis einstellen, während all Fäden Wach ähnlich ist, ein manuelles Reset-Ereignis zu pulsieren, aber zuverlässiges (siehe PulseEvent für Details).

Ich folge daraus, dass das Verhalten das gleiche wie in der Pthread-Bibliothek ist. Aber wie im obigen Kommentar gesagt, spielt dieser Aspekt eigentlich keine große Rolle, wenn Sie beabsichtigen, Zustandsvariablen auf eine Standardweise zu verwenden.

1

Dies ist ein undokumentiertes Implementierungsdetail, Änderungen vorbehalten. Also muss sich Ihr Code in beiden Fällen korrekt verhalten. Wie Raymond schon darauf hingewiesen hat, passiert das bei use condition variables as intended, automatisch.

Wenn aus irgendeinem Grund Sie das übliche Muster nicht verwenden, sollten Sie davon ausgehen, dass die Folge verloren gehen, aber denken Sie daran, dass Threads auf einem Bedingungsvariable warten kann jederzeit aus irgendeinem Grund oder keine geweckt:

Bedingungsvariablen unterliegen unechten Wakeups (diejenigen, die nicht mit einer expliziten wake zugeordnet)

das bedeutet, dass, wenn Sie die Wake verloren, aber in der Tat annehmen, dass es nicht ist, es sieht aus wie eine unechte aufwecken, soweit es den Code betrifft. Vorausgesetzt, dass der Code korrekt mit weckenden Wakeups arbeitet, wird er auch mit diesem Szenario richtig umgehen.

Verwandte Themen