Die std::lock_guard
wird nur für zwei Zwecke verwendet:
- Automate Mutex Entriegelungs während Zerstörung (keine Notwendigkeit
.unlock()
zu nennen).
- 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.
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. –
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. –