Namensräume
Varianten
Aktionen

std::unique_lock

Von cppreference.com
< cpp‎ | thread
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
Gegenseitiger Ausschluss
(C++11)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
unique_lock
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
Freie Funktionen für atomare Flags
 
 
Definiert in Header <mutex>
template< class Mutex >
class unique_lock;
(seit C++11)

Die Klasse unique_lock ist ein universeller Mutex-Besitz-Wrapper, der verzögertes Sperren, zeitlich begrenzte Sperrversuche, rekursive Sperren, die Übertragung von Sperrbesitz 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, aber nicht von CopyConstructible oder CopyAssignable.

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

Inhalt

[edit] Template-Parameter

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

[edit] Verschachtelte Typen

Typ Definition
mutex_type Mutex

[edit] Memberfunktionen

konstruiert einen unique_lock, der optional den übergebenen Mutex sperrt (d.h. den Besitz übernimmt)
(public member function) [edit]
entsperrt den zugehörigen Mutex (d.h. gibt den Besitz frei), falls vorhanden
(public member function) [edit]
entsperrt den zugehörigen Mutex (d.h. gibt den Besitz frei), falls vorhanden, und erwirbt den Besitz eines anderen
(public member function) [edit]
Sperren
sperrt den zugehörigen Mutex (d.h. übernimmt den Besitz)
(public member function) [edit]
versucht, den zugehörigen Mutex ohne Blockieren zu sperren (d.h. den Besitz zu übernehmen)
(public member function) [edit]
versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen) und kehrt zurück, wenn der Mutex für die angegebene Zeitspanne nicht verfügbar war
(public member function) [edit]
versucht, den zugehörigen TimedLockable Mutex zu sperren (d.h. den Besitz zu übernehmen) und kehrt zurück, wenn der Mutex bis zum Erreichen des angegebenen Zeitpunkts nicht verfügbar war
(public member function) [edit]
entsperrt den zugehörigen Mutex (d.h. gibt den Besitz frei)
(public member function) [edit]
Modifizierer
tauscht den Zustand mit einem anderen std::unique_lock
(public member function) [edit]
trennt den zugehörigen Mutex, ohne ihn zu entsperren (d.h. den Besitz aufzugeben)
(public member function) [edit]
Observer
gibt einen Zeiger auf den zugehörigen Mutex zurück
(public member function) [edit]
prüft, ob die Sperre den zugehörigen Mutex besitzt (d.h. gesperrt hat)
(public member function) [edit]
prüft, ob die Sperre den zugehörigen Mutex besitzt (d.h. gesperrt hat)
(public member function) [edit]

[edit] Nicht-Member-Funktionen

spezialisiert den Algorithmus std::swap
(Funktionsvorlage) [edit]

[edit] 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

[edit] 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 aus unique_lock<Mutex> wurde bereitgestellt entfernt

[edit] Siehe auch

(C++11)
sperrt angegebene Mutexe, blockiert, wenn einer nicht verfügbar ist
(Funktionsvorlage) [bearbeiten]
implementiert einen streng bereichsbezogenen Mutex-Besitz-Wrapper
(Klassen-Template) [bearbeiten]
todesfallsichere RAII-Hülle für mehrere Mutexe
(Klassen-Template) [bearbeiten]
(C++11)
bietet grundlegende Gegenseitiger-Ausschluss-Funktionen
(Klasse) [bearbeiten]