2010-11-20 4 views
3

Kann man auf eine boost :: condition_variable "warten", ohne zuerst eine Mutex-Sperre zu erhalten? Kann das nicht mit der pthread lib direkt gemacht werden?boost :: condition_variable warte ohne Sperre

Der Einfachheit halber möchte ich vermeiden, direkt auf die OS-Ebene (wie Futex auf Linux) zu gehen. Aber ich will auch nicht den Overhead des Mutex Calls.

Ich bin mir der Race-Bedingungen unter normalen Umständen ziemlich bewusst. Ich habe das auf andere Weise abgedeckt.

+0

Wenn Sie sich das Nutzungsmuster von boost :: condition_variable ansehen, macht es keinen Sinn, es zu sein ohne Mutex verwendet. Bei der Eingabe entsperrt die wait -Methode automatisch den Mutex und fügt den Thread einer Warteschlange hinzu und sperrt später den Mutex, wenn dieser zurückkommt :) –

Antwort

6

Der Mutex muss in beiden Fällen zuerst erfasst werden.

Von boost.threads Dokumentation:

Leere wait (boost :: unique_lock & Sperre)

Voraussetzung: Sperre durch den aktuellen Thread gesperrt [...]

Von pthread_cond_wait man page:

Die pthread_cond_wait() und pthread_cond_timedwait() -Funktionen werden verwendet, auf eine Bedingungsvariable zu blockieren. Sie werden mit Mutex gesperrt von der aufrufende Thread oder undefined Verhalten wird Ergebnis.

Mir ist keine Alternative bekannt.

+0

Okay, also definitiv kein Weg mit diesem System. Ich muss nach etwas anderem suchen. –

0

Nein, ist es nicht. Wie Sie aus den condition_variable API-Spezifikationen sehen können, muss es immer mit einem abschließbaren gepackten in einem unique_lock versehen werden. Aber ich verstehe nicht wirklich, wo das Problem liegt. Dieses Konstrukt implementiert einen "Monitor", der ohne eine Art Synchonisierungsobjekt nicht möglich ist ...

Verwandte Themen