定义于头文件
<mutex>
|
||
template< class... MutexTypes >
class scoped_lock; |
(C++17 起) | |
类 scoped_lock
是提供便利 RAII 风格机制的互斥包装器,它在作用域块的存在期间占有一或多个互斥。
创建 scoped_lock
对象时,它试图取得给定互斥的所有权。控制离开创建 scoped_lock
对象的作用域时,析构 scoped_lock
并以逆序释放互斥。若给出数个互斥,则使用免死锁算法,如同以 std::lock 。
scoped_lock
类不可复制。
目录 |
MutexTypes | - | 要锁定的互斥类型。类型必须满足可锁 (Lockable ) 要求,除非 sizeof...(MutexTypes)==1 ,该情况下唯一的类型必须满足基础可锁 (BasicLockable )
|
成员类型 | 定义 |
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++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2981 | C++17 | 曾提供来自 scoped_lock<MutexTypes...> 的冗余推导指引
|
已移除 |
(C++11)
|
实现可移动的互斥锁有权包装器 (类模板) |
(C++11)
|
实现严格基于作用域的互斥所有权包装器 (类模板) |