std::unique_lock
来自 cppreference.cn
定义于头文件 <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) |