Namespaces
Variants

std:: unique_lock

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
(C++11)
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Definiert in Header <mutex>
template < class Mutex >
class unique_lock ;
(seit C++11)

Die Klasse unique_lock ist ein allgemeiner Mutex-Besitzwrapper, der verzögertes Sperren, zeitbeschränkte Sperrversuche, rekursives Sperren, Übertragung der Sperreigenschaft und die Verwendung mit Bedingungsvariablen ermöglicht.

Die Klasse unique_lock ist verschiebbar, aber nicht kopierbar -- sie erfüllt die Anforderungen von MoveConstructible und MoveAssignable , jedoch nicht die von CopyConstructible oder CopyAssignable .

Die Klasse unique_lock erfüllt die BasicLockable Anforderungen. Wenn Mutex die Lockable Anforderungen erfüllt, erfüllt unique_lock ebenfalls die Lockable Anforderungen (z.B. kann in std::lock verwendet werden); wenn Mutex die TimedLockable Anforderungen erfüllt, erfüllt unique_lock ebenfalls die TimedLockable Anforderungen.

Inhaltsverzeichnis

Template-Parameter

Mutex - der Typ des zu sperrenden Mutex. Der Typ muss die BasicLockable Anforderungen erfüllen

Verschachtelte Typen

Typ Definition
mutex_type Mutex

Memberfunktionen

Konstruiert einen unique_lock , optional mit Sperren (d.h. Übernahme des Besitzes) des bereitgestellten Mutex
(öffentliche Elementfunktion)
entsperrt (d.h. gibt den Besitz frei) des zugehörigen Mutex, falls im Besitz
(öffentliche Elementfunktion)
entsperrt (d.h. gibt den Besitz frei) des Mutex, falls im Besitz, und übernimmt den Besitz eines anderen
(öffentliche Elementfunktion)
Sperren
sperrt (d.h. übernimmt den Besitz) des zugehörigen Mutex
(öffentliche Elementfunktion)
versucht, den zugehörigen Mutex ohne Blockierung zu sperren (d.h. den Besitz zu übernehmen)
(öffentliche Elementfunktion)
versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen), gibt zurück, falls der Mutex für die angegebene Zeitdauer nicht verfügbar war
(öffentliche Elementfunktion)
versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen), gibt zurück, falls der Mutex nicht verfügbar war, bis der angegebene Zeitpunkt erreicht wurde
(öffentliche Elementfunktion)
entsperrt (d.h. gibt den Besitz frei) des zugehörigen Mutex
(öffentliche Elementfunktion)
Modifikatoren
tauscht den Zustand mit einem anderen std::unique_lock
(öffentliche Elementfunktion)
trennt den zugehörigen Mutex ohne Entsperren (d.h. ohne Freigabe des Besitzes)
(öffentliche Elementfunktion)
Beobachter
gibt einen Zeiger auf den zugehörigen Mutex zurück
(öffentliche Elementfunktion)
prüft, ob die Sperre ihren zugehörigen Mutex besitzt (d.h. gesperrt hat)
(öffentliche Elementfunktion)
prüft, ob die Sperre ihren zugehörigen Mutex besitzt (d.h. gesperrt hat)
(öffentliche Elementfunktion)

Nicht-Member-Funktionen

spezialisiert den std::swap Algorithmus
(Funktionsschablone)

Hinweise

Ein häufiger Anfängerfehler ist es, einem unique_lock -Variablen "zu vergessen", einen Namen zu geben, z.B. std :: unique_lock ( mtx ) ; (was standardmäßig eine unique_lock -Variable namens mtx konstruiert) oder std :: unique_lock { mtx } ; (was ein Prvalue-Objekt konstruiert, das sofort zerstört wird), wodurch tatsächlich keine Sperre konstruiert wird, die einen Mutex für den Rest des Gültigkeitsbereichs hält.

Beispiel

#include <iostream>
#include <mutex>
#include <thread>
struct Box
{
    explicit Box(int num) : num_things{num} {}
    int num_things;
    std::mutex m;
};
void transfer(Box& from, Box& to, int num)
{
    // don't actually take the locks yet
    std::unique_lock lock1{from.m, std::defer_lock};
    std::unique_lock lock2{to.m, std::defer_lock};
    // lock both unique_locks without deadlock
    std::lock(lock1, lock2);
    from.num_things -= num;
    to.num_things += num;
    // “from.m” and “to.m” mutexes unlocked in unique_lock dtors
}
int main()
{
    Box acc1{100};
    Box acc2{50};
    std::thread t1{transfer, std::ref(acc1), std::ref(acc2), 10};
    std::thread t2{transfer, std::ref(acc2), std::ref(acc1), 5};
    t1.join();
    t2.join();
    std::cout << "acc1: " << acc1.num_things << "\n"
                 "acc2: " << acc2.num_things << '\n';
}

Ausgabe:

acc1: 95
acc2: 55

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2981 C++17 redundanter Deduction Guide von unique_lock<Mutex> wurde bereitgestellt entfernt

Siehe auch

(C++11)
sperrt angegebene Mutexe, blockiert falls nicht verfügbar
(Funktions-Template)
(C++11)
implementiert einen streng bereichsbasierten Mutex-Besitz-Wrapper
(Klassen-Template)
Deadlock-vermeidender RAII-Wrapper für mehrere Mutexe
(Klassen-Template)
(C++11)
bietet grundlegende gegenseitige Ausschluss-Einrichtung
(Klasse)