std:: unique_lock
|
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
|
(C++11)
|
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) |
|
(C++17)
|
Deadlock-vermeidender RAII-Wrapper für mehrere Mutexe
(Klassen-Template) |
|
(C++11)
|
bietet grundlegende gegenseitige Ausschluss-Einrichtung
(Klasse) |