std::scoped_lock
来自cppreference.com
| 在标头 <mutex> 定义
|
||
| |
(C++17 起) | |
类 scoped_lock 是提供便利 RAII 风格机制的互斥包装器,它在作用域块的存在期间占有一或多个互斥。
创建 scoped_lock 对象时,它视图取得给定互斥的所有权。控制离开创建 scoped_lock 对象的作用域时,析构 scoped_lock 并以逆序释放互斥。若给出数个互斥,则使用免死锁算法,如同以 std::lock 。
scoped_lock 类不可复制。
模板形参
| MutexTypes | - | 要锁定的互斥类型。类型必须满足Template:concept要求,除非 sizeof...(MutexTypes)==1 ,该情况下唯一的类型必须满足Template:concept
|
成员类型
| 成员类型 | 定义 |
mutex_type
|
互斥 |
成员函数
构造 scoped_lock,可选地锁定给定的互斥体 (公开成员函数) | |
析构 scoped_lock 对象,解锁底层互斥体 (公开成员函数) | |
operator= [弃置] |
不可复制 (公开成员函数) |
推导指引
示例
| 本节未完成 原因:应当演示多重互斥 |
运行此代码
#include <thread>
#include <mutex>
#include <iostream>
int g_i = 0;
std::mutex g_i_mutex; // 保护 g_i
void safe_increment()
{
std::scoped_lock lock{g_i_mutex};
++g_i;
std::cout << std::this_thread::get_id() << ": " << g_i << '\n';
// g_i_mutex 在锁离开作用域时自动释放
}
int main()
{
std::cout << __func__ << ": " << g_i << '\n';
std::thread t1(safe_increment);
std::thread t2(safe_increment);
t1.join();
t2.join();
std::cout << __func__ << ": " << g_i << '\n';
}
可能的输出:
main: 0
140641306900224: 1
140641298507520: 2
main: 2
参阅
(C++11) |
实现可移动的互斥体所有权包装器 (类模板) |
(C++11) |
实现严格基于作用域的互斥体所有权包装器 (类模板) |