std::defer_lock, std::try_to_lock, std::adopt_lock, std::defer_lock_t, std::try_to_lock_t, std::adopt_lock_t
來自 cppreference.com
定義於標頭檔案 <mutex> |
||
struct defer_lock_t { explicit defer_lock_t() = default; }; |
(1) | (C++11 起) |
constexpr std::defer_lock_t defer_lock {}; |
(2) | (C++11 起) (C++17 起為 inline) |
struct try_to_lock_t { explicit try_to_lock_t() = default; }; |
(3) | (C++11 起) |
constexpr std::try_to_lock_t try_to_lock {}; |
(4) | (C++11 起) (C++17 起為 inline) |
struct adopt_lock_t { explicit adopt_lock_t() = default; }; |
(5) | (C++11 起) |
constexpr std::adopt_lock_t adopt_lock {}; |
(6) | (C++11 起) (C++17 起為 inline) |
1,3,5) 空類標籤型別
std::defer_lock_t
、std::try_to_lock_t
和 std::adopt_lock_t
可用於 std::unique_lock 和 std::shared_lock 的建構函式引數列表,以指定鎖定策略。2,4,6) 相應的
std::defer_lock
、std::try_to_lock
和 std::adopt_lock
(1,3,5) 的例項可以傳遞給建構函式,以指示鎖定策略的型別。類模板 std::lock_guard 的其中一個建構函式只接受標籤 std::adopt_lock
。
型別 | 效果 |
defer_lock_t
|
不獲取互斥體所有權 |
try_to_lock_t
|
嘗試獲取互斥體所有權而不阻塞 |
adopt_lock_t
|
假定呼叫執行緒已擁有互斥體 |
[編輯] 示例
執行此程式碼
#include <iostream> #include <mutex> #include <thread> struct bank_account { explicit bank_account(int balance) : balance{balance} {} int balance; std::mutex m; }; void transfer(bank_account& from, bank_account& to, int amount) { if (&from == &to) // avoid deadlock in case of self transfer return; // lock both mutexes without deadlock std::lock(from.m, to.m); // make sure both already-locked mutexes are unlocked at the end of scope std::lock_guard lock1{from.m, std::adopt_lock}; std::lock_guard lock2{to.m, std::adopt_lock}; // equivalent approach: // std::unique_lock<std::mutex> lock1{from.m, std::defer_lock}; // std::unique_lock<std::mutex> lock2{to.m, std::defer_lock}; // std::lock(lock1, lock2); from.balance -= amount; to.balance += amount; } int main() { bank_account my_account{100}; bank_account your_account{50}; std::thread t1{transfer, std::ref(my_account), std::ref(your_account), 10}; std::thread t2{transfer, std::ref(your_account), std::ref(my_account), 5}; t1.join(); t2.join(); std::cout << "my_account.balance = " << my_account.balance << "\n" "your_account.balance = " << your_account.balance << '\n'; }
輸出
my_account.balance = 95 your_account.balance = 55
[編輯] 參閱
構造一個 lock_guard ,可選地鎖定給定的互斥體( std::lock_guard<Mutex> 的公共成員函式) | |
構造一個 unique_lock ,可選地鎖定(即,取得所有權)提供的互斥體( std::unique_lock<Mutex> 的公共成員函式) |