cpp/thread/scoped lock:修订间差异
来自cppreference.com
无编辑摘要 |
无编辑摘要 |
||
| 第11行: | 第11行: | ||
类 {{tt|scoped_lock}} 是提供便利 [[enwiki:Resource_Acquisition_Is_Initialization|RAII 风格]]机制的互斥包装器,它在作用域块的存在期间占有一或多个互斥。 | 类 {{tt|scoped_lock}} 是提供便利 [[enwiki:Resource_Acquisition_Is_Initialization|RAII 风格]]机制的互斥包装器,它在作用域块的存在期间占有一或多个互斥。 | ||
创建 {{tt|scoped_lock}} 对象时,它 | 创建 {{tt|scoped_lock}} 对象时,它图取得给定互斥的所有权。控制离开创建 {{tt|scoped_lock}} 对象的作用域时,析构 {{tt|scoped_lock}} 并以逆序释放互斥。若给出数个互斥,则使用免死锁算法,如同以 {{lc|std::lock}} 。 | ||
{{tt|scoped_lock}} 类不可复制。 | {{tt|scoped_lock}} 类不可复制。 | ||
2017年12月3日 (日) 20:31的版本
| 在标头 <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 (若 sizeof...(MutexTypes)==1)
|
Mutex , MutexTypes... 中的单独类型
|
成员函数
构造 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++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2981 | C++17 | 曾提供来自 scoped_lock<MutexTypes...> 的冗余推导指引
|
已移除 |
参阅
(C++11) |
实现可移动的互斥体所有权包装器 (类模板) |
(C++11) |
实现严格基于作用域的互斥体所有权包装器 (类模板) |