C++ 参考手册

位置:首页 > C++ 参考手册 >线程支持库 > std::defer_lock, std::try_to_lock, std::adopt_lock

定义于头文件 <mutex>
constexpr std::defer_lock_t defer_lock {};
(C++11 起)
(C++17 前)
inline constexpr std::defer_lock_t defer_lock {};
(C++17 起)
constexpr std::try_to_lock_t try_to_lock {};
(C++11 起)
(C++17 前)
inline constexpr std::try_to_lock_t try_to_lock {};
(C++17 起)
constexpr std::adopt_lock_t adopt_lock {};
(C++11 起)
(C++17 前)
inline constexpr std::adopt_lock_t adopt_lock {};
(C++17 起)

std::defer_lockstd::try_to_lockstd::adopt_lock 分别是空结构体标签类型 std::defer_lock_tstd::try_to_lock_tstd::adopt_lock_t 的实例。

它们用于为 std::lock_guardstd::unique_lockstd::shared_lock 指定锁定策略。

 
类型 效果
defer_lock_t 不获得互斥的所有权
try_to_lock_t 尝试获得互斥的所有权而不阻塞
adopt_lock_t 假设调用方线程已拥有互斥的所有权

示例

#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)
{
    // 锁定两个互斥而不死锁
    std::lock(from.m, to.m);
    // 保证二个已锁定互斥在作用域结尾解锁
    std::lock_guard<std::mutex> lock1(from.m, std::adopt_lock);
    std::lock_guard<std::mutex> lock2(to.m, std::adopt_lock);
 
// 等价方法:
//    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();
}


参阅

用于指定锁定策略的标签类型
(类)
构造 lock_guard ,可选地锁定给定的互斥
(std::lock_guard<Mutex> 的公开成员函数)
构造 unique_lock ,可选地锁定提供的互斥
(std::unique_lock<Mutex> 的公开成员函数)