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.
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
Verwandte (http://stackoverflow.com/q/2763714/2069064) – Barry
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