2016-07-12 18 views

Antwort

3

Mithilfe von lock_guard wird der Mutex automatisch wieder freigegeben, wenn er den Gültigkeitsbereich verlässt. Das macht es unmöglich zu vergessen, es zu entsperren, wenn es zurückkehrt oder wenn eine Ausnahme ausgelöst wird. Sie sollten immer bevorzugen, lock_guard oder unique_lock anstelle von mutex::lock() zu verwenden. Siehe http://kayari.org/cxx/antipatterns.html#locking-mutex

lock_guard ist ein Beispiel für einen RAII oder SBRM Typen.

0

Die std::lock_guard wird nur für zwei Zwecke verwendet:

  1. Automate Mutex Entriegelungs während Zerstörung (keine Notwendigkeit .unlock() zu nennen).
  2. Ermöglicht die gleichzeitige Sperre mehrerer Mutexe, um das Deadlock-Problem zu beheben.

Für den letzten Anwendungsfall müssen Sie std::adopt_lock Flagge:

std::lock(mutex_one, mutex_two); 
std::lock_guard<std::mutex> lockPurposeOne(mutex_one, std::adopt_lock); 
std::lock_guard<std::mutex> lockPurposeTwo(mutex_two, std::adopt_lock); 

Auf der anderen Seite benötigen Sie zuteilen noch eine andere Klasse-Instanz für die Wache jedes Mal, müssen Sie die Mutex sperren, wie std::lock_guard hat keine Mitgliedsfunktionen. Wenn Sie Wächter mit Entriegelungsfunktionalität benötigen, werfen Sie einen Blick auf std::unique_lock Klasse. Sie können auch std::shared_lock zum parallelen Lesen Ihres Vektors verwenden.

Sie können feststellen, dass std::shared_lock Klasse in Header-Dateien kommentiert und nur mit C++ 17 zugänglich sein wird. Laut Header-Datei können Sie verwenden, aber wenn Sie versuchen, die App zu bauen, wird es fehlschlagen, wie Apple die Header-Dateien, aber nicht die libC++ selbst aktualisiert hatte.

So für Objective-C App kann es bequemer sein, GCD zu verwenden, ein paar Warteschlange für alle Ihre C++ - Container zur gleichen Zeit zuweisen und Semaphoren wo erforderlich platzieren. Werfen Sie einen Blick auf diese hervorragende comparison.

+0

Was bedeutet _ "müssen Sie jedes Mal, wenn Sie den Mutex sperren müssen, eine weitere Klasseninstanz für den Wächter zuweisen?" Du machst es so, als wäre 'lock_guard' schlecht. –

+0

Es ist nicht schlecht, wenn Sie es brauchen. Aber wenn Sie die App in den Weg bauen, wird dieser Deadlock nicht möglich sein - Sie brauchen ihn nicht. –

Verwandte Themen