Der Unterschied besteht darin, dass Sie a sperren und entsperren können std::unique_lock. std::lock_guardwird beim Bau nur einmal gesperrt und bei Zerstörung entsperrt.
Für Anwendungsfall B benötigen Sie also definitiv eine std::unique_lockfür die Bedingungsvariable. In Fall A hängt es davon ab, ob Sie den Schutz wieder verriegeln müssen.
std::unique_lockhat andere Funktionen, die es ermöglichen, zB: ohne sofortiges Sperren des Mutex zu konstruieren, aber den RAII-Wrapper zu erstellen (siehe hier ).
std::lock_guardbietet 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_guardund std::unique_lockgleich. So im obigen Fall, könnten Sie ersetzen std::lock_guardmit std::unique_lock. Allerdings std::unique_lockhaben könnte mehr Aufwand ein bisschen.
Beachten Sie, dass in diesen Tagen sollte man verwenden std::scoped_lockstatt std::lock_guard.