std::unique_lock
來自 cppreference.com
定義於標頭檔案 <mutex> |
||
template< class Mutex > class unique_lock; |
(C++11 起) | |
類 unique_lock
是一個通用互斥量所有權包裝器,允許延遲鎖定、帶時間限制的鎖定嘗試、遞迴鎖定、鎖所有權轉移以及與條件變數一起使用。
類 unique_lock
可移動但不可複製——它滿足 MoveConstructible 和 MoveAssignable 的要求,但不滿足 CopyConstructible 或 CopyAssignable 的要求。
類 unique_lock
滿足 BasicLockable 要求。如果 Mutex
滿足 Lockable 要求,則 unique_lock
也滿足 Lockable 要求(例如,可在 std::lock 中使用);如果 Mutex
滿足 TimedLockable 要求,則 unique_lock
也滿足 TimedLockable 要求。
目錄 |
[編輯] 模板引數
Mutex | - | 要鎖定的互斥量型別。該型別必須滿足 BasicLockable 要求 |
[編輯] 巢狀型別
型別 | 定義 |
mutex_type
|
Mutex
|
[編輯] 成員函式
構造一個 unique_lock ,可選地鎖定(即獲取)所提供的互斥量(public member function) | |
如果擁有,則解鎖(即釋放)關聯的互斥量 (public member function) | |
如果擁有,則解鎖(即釋放)互斥量,並獲取另一個互斥量的所有權 (public member function) | |
加鎖 | |
鎖定(即獲取)關聯的互斥量 (public member function) | |
嘗試鎖定(即獲取)關聯的互斥量而不阻塞 (public member function) | |
嘗試鎖定(即獲取)關聯的 TimedLockable 互斥量,如果在指定持續時間內互斥量不可用則返回 (public member function) | |
嘗試鎖定(即獲取)關聯的 TimedLockable 互斥量,如果在指定時間點之前互斥量不可用則返回 (public member function) | |
解鎖(即釋放)關聯的互斥量 (public member function) | |
修改器 | |
與另一個 std::unique_lock 交換狀態 (public member function) | |
解除與關聯互斥量的關聯,而不解鎖(即釋放)它 (public member function) | |
觀察器 | |
返回指向關聯互斥量的指標 (public member function) | |
測試鎖是否擁有(即已鎖定)其關聯的互斥量 (public member function) | |
測試鎖是否擁有(即已鎖定)其關聯的互斥量 (public member function) |
[編輯] 非成員函式
(C++11) |
特化 std::swap 演算法 (function template) |
[編輯] 示例
執行此程式碼
#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'; }
輸出
acc1: 95 acc2: 55
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2981 | C++17 | 提供了冗餘的 unique_lock<Mutex> 推導指南 |
已移除 |
[編輯] 另請參閱
(C++11) |
鎖定指定的互斥體,如果任何一個不可用則阻塞 (function template) |
(C++11) |
實現嚴格基於作用域的互斥體所有權包裝器 (class template) |
(C++17) |
用於多個互斥體的死鎖避免 RAII 包裝器 (class template) |
(C++11) |
提供基本的互斥設施 (class) |