Der Unterschied besteht darin, dass Sie a sperren und entsperren können std::unique_lock
. std::lock_guard
wird beim Bau nur einmal gesperrt und bei Zerstörung entsperrt.
Für Anwendungsfall B benötigen Sie also definitiv eine std::unique_lock
für die Bedingungsvariable. In Fall A hängt es davon ab, ob Sie den Schutz wieder verriegeln müssen.
std::unique_lock
hat andere Funktionen, die es ermöglichen, zB: ohne sofortiges Sperren des Mutex zu konstruieren, aber den RAII-Wrapper zu erstellen (siehe hier ).
std::lock_guard
bietet auch einen praktischen RAII-Wrapper, kann jedoch mehrere Mutexe nicht sicher sperren. Es kann verwendet werden, wenn Sie einen Wrapper für einen begrenzten Bereich benötigen, z. B.: Eine Mitgliedsfunktion:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
};
Um eine Frage von chmike zu klären, sind standardmäßig std::lock_guard
und std::unique_lock
gleich. So im obigen Fall, könnten Sie ersetzen std::lock_guard
mit std::unique_lock
. Allerdings std::unique_lock
haben könnte mehr Aufwand ein bisschen.
Beachten Sie, dass in diesen Tagen sollte man verwenden std::scoped_lock
statt std::lock_guard
.