2016-08-04 55 views
0

Ich schreibe den Windows-Port für eine Linux-Anwendung und ich versuche, einen geeigneten Ersatz für pthread_cond_wait() zu finden. Die nächste Alternative scheint SleepConditionVariableCS() zu sein. Ich bin aber nicht bereit, diese Funktion zu nutzen, weil es CriticalSections verwendet, die im Grunde leichte rekursive Mutexe sind. Ich würde eine nicht rekursive Sperrobjektalternative bevorzugen - gibt es eine?Gibt es eine Version/Äquivalent von SleepConditionVariableCS(), die ein nicht-rekursives Mutex (like) -Objekt verwendet?

P.S. -

  1. Bei der Anwendung anstelle von pthread mutexes Ich verwende Semaphores mit maximaler Zählung 1.
  2. Wenn rekursive Mutexe als problematisch sind as stated by David Butenhof dann warum Windows bietet nur rekursive Mutexe (oder Critical) als Option? Ist das ein massiver #Fail von Windows oder ist David Butenhof veraltet/falsch?
+0

Die Concurrency Runtime bietet auch Variablen Zustand, aber Sie werden von denjenigen abweichen, nicht mögen. Rekursive Sperren sind nur ein Merkmal eines Unternehmens mit einer Telefonnummer von 1-800 Support und einem Betriebssystem, das sie * sehr * billig zu erstellen macht. Wenn Sie versuchen, dies zu tun, weil Sie annehmen, dass es billiger ist, dann kümmern Sie sich nicht. Betrachten wir [Erhöhung] (http://www.boost.org/doc/libs/1_58_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref), damit Sie sich besser darüber. –

+0

FWIW, können Sie einfach einen rekursiven Mutex in einen nicht-rekursiven konvertieren. Erhöhen Sie einfach einen Zähler, wenn Sie den Mutex beanspruchen, vergewissern Sie sich, dass er gleich eins ist, und dekrementieren Sie ihn, wenn Sie ihn freigeben. –

Antwort

2

Windows Vista und bietet später Slim Reader/Writer (SRW) Locks als nicht-rekursive Sperrobjekt Alternative .

Da die Dokumentation heißt es:

Ein SRW Schloss ist die Größe eines Zeigers. Der Vorteil ist, dass der Sperrzustand schnell aktualisiert werden kann. Der Nachteil ist, dass nur sehr wenig Zustandsinformationen gespeichert werden können, so SRW Schlösser können nicht rekursiv erworben werden. Darüber hinaus kann ein Thread, der eine SRW-Sperre im gemeinsam genutzten Modus besitzt, seine Besitzrechte für die Sperre nicht auf den exklusiven Modus aktualisieren.

Eine Windows-Bedingungsvariable kann eine SRW-Sperre anstelle einer CriticalSection-Sperre verwenden. Siehe SleepConditionVariableSRW().

: PS. Hier ist eine andere Ansicht über das Gute gegen das Schlechte von recursive locks.

+1

Windows-Bedingungsvariablen können SRW-Sperren anstelle von CriticalSection-Sperren verwenden. Siehe ['SleepConditionVariableSRW()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms686304.aspx). –

+0

@RemyLebeau - Könnten Sie das als separate Antwort posten? Genau das habe ich gesucht. –