2015-05-12 3 views
11

Bedingungsvariablen sind einer der Aspekte von C++ 11 Ich bin immer noch mit etwas zu kämpfen. Von dem, was ich gesammelt habe, ist eine Zustandsvariable einem Semaphor sehr ähnlich.Warum eine Zustandsgröße benötigt eine Sperre (und damit auch einen Mutex)

Aber dann wieder, würde ein Semaphore keine Sperre müssen funktionieren. Eine Bedingungsvariable tut es. Und eine Sperre benötigt wiederum einen Mutex. Um die recht einfache Funktionalität eines Semaphors nutzen zu können, müssen wir nun nicht nur eine Zustandsvariable verwalten. Aber auch ein Mutex und ein Schloss.

Warum braucht eine Zustandsvariable das? Und welche zusätzlichen Funktionen bietet diese Anforderung?

+1

Der Mutex ist das Schloss. Die Thread-Klassensperre ist nur ein RAII-Wrapper um den Mutex. Daher wird sie nicht verwaltet, sondern lokal verwendet. – stefaanv

+0

Verwandte (http://stackoverflow.com/q/2763714/2069064) – Barry

+0

Tangential im Zusammenhang [Warum Zustand do pThreads variable Funktionen ein Mutex benötigen?]: Sie können Semaphore in Bezug auf mutexes und Bedingungsvariablen ziemlich leicht implementieren. Bedingungsvariablen sind nur ein anderes Wartegrundelement; sie machen es viel einfacher, auf allgemeine, vom Benutzercode ausgedrückte Bedingungen zu warten. – Mark

Antwort

6

Zustandsvariablen werden im Allgemeinen verwendet, um eine Zustandsänderung zu signalisieren. Ein Mutex wird normalerweise benötigt, um diese Änderung vorzunehmen, und das folgende Signal ist atomar.

Ein Semaphor kapselt einigen Zustand (ein Flag oder Zähler) zusammen mit dem Signalisierungs-Mechanismus. Eine Zustandsvariable ist primitiver und liefert nur das Signal.

+2

Zumindest in C++ muss die Signalisierung nicht mit einer Sperre geschützt werden. Tatsächlich kann es in Abhängigkeit davon, wie die Implementierung die Planung des wartenden Threads handhabt, für die Leistung schädlich sein, die Signalisierung innerhalb der Sperre auszuführen. Zwar gibt es bestimmte Bedingungen, unter denen sich die Programmlogik auf die Tatsache verlassen kann, dass die Zustandsänderung und die Signalisierung atomar ablaufen, dies ist jedoch im Allgemeinen nicht wahr, wenn eine Zustandsvariable verwendet wird. – ComicSansMS

+0

Ist es nicht umgekehrt? Die a-Zustandsvariable ist ein Semaphor auf einem Mutex.Gibt an, ob der Mutex wieder verfügbar ist? Den Semaphor primitiver machen. – laurisvr

+0

@laurisvr: Nein, ein Semaphor kombiniert ein atomares Flag/Counter mit einem Signal, also ist es nicht primitiv. Eine Bedingungsvariable ist nur ein Signal, das Sie normalerweise in Verbindung mit anderen Dingen verwenden, deren Zustandsänderungen Sie signalisieren möchten. –

4

Im Allgemeinen, wenn Sie etwas signalisiert haben, hat (über eine Zustandsgröße) geändert Sie einen Code benötigen diese Änderung laufen zu handhaben und dass Code hat sicher die geändertenen Daten zu lesen. Wenn du keine Sperre mit dem cv verbunden hast, dann könnte dein Thread, der auf dem cv wartet, aufwachen, dann versuche (und scheitere), die mit den Daten verbundene Sperre zu erlangen und muss daher wieder nachgeben. Mit einer CV/Lock-Combo kann das zugrundeliegende System den Thread nur aufwecken, wenn der Thread die entsprechende Sperre als eine Einheit erhalten kann und somit effizienter ist.

Seine unwahrscheinlich, dass ein Lebenslauf auf seine eigene ist nützlich, da es keine Daten über die Tatsache, gibt es signalisiert wurde. Wenn Sie sich vorstellen, cv-Anwendungen zu verwenden - etwa eine thread-safe-verknüpfte Liste mit Produzenten und Konsumenten, haben Sie Variablen, die {list, cv, lock} darstellen. In diesem Fall nimmst du die Sperre, mutierst die Liste, gibst die Sperre frei und signalisierst dann den Lebenslauf. Auf Ihrem Consumer-Thread müssen Sie sehr wahrscheinlich das Schloss nehmen, sobald Sie signalisiert haben, auf der Liste zu agieren. Das Schloss, das Sie erhalten, sobald Sie aus dem signalisierten CV aufwachen, ist eine gute Sache.

Betrachten Sie etwas wie Ereignisse auf Windows (:: CreateEvent), die cv sind ohne die implizite Sperre, eine Menge Zeit, die ihnen eine Sperre zugeordnet werden, aber nur nicht in die tatsächliche Verwendung eingebaut.

Obwohl dies nicht der ursprüngliche Grund Bedingung Variable in Pthreads erstellt wurde (sie verwendet die Sperre, um das cv selbst zu schützen, die nicht mehr in C++ benötigt wird) der Grund und die Nützlichkeit von Sperren mit cvs hat was in diesem migriert Antworten.

Verwandte Themen