名稱空間
變體
操作

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
< cpp‎ | thread
 
 
併發支援庫
執行緒
(C++11)
(C++20)
this_thread 名稱空間
(C++11)
(C++11)
(C++11)
協同取消
互斥
(C++11)
通用鎖管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
defer_locktry_to_lockadopt_lockdefer_lock_ttry_to_lock_tadopt_lock_t
(C++11)(C++11)(C++11)(C++11)(C++11)(C++11)
條件變數
(C++11)
訊號量
門閂和屏障
(C++20)
(C++20)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
危險指標
原子型別
(C++11)
(C++20)
原子型別的初始化
(C++11)(C++20 中已棄用)
(C++11)(C++20 中已棄用)
記憶體排序
(C++11)(C++26 中已棄用)
原子操作的自由函式
原子標誌的自由函式
 
定義於標頭檔案 <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_tstd::try_to_lock_tstd::adopt_lock_t 可用於 std::unique_lockstd::shared_lock 的建構函式引數列表,以指定鎖定策略。
2,4,6) 相應的 std::defer_lockstd::try_to_lockstd::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> 的公共成員函式) [編輯]