std::lock_guard
定义于头文件 <mutex>
|
||
template< class Mutex > class lock_guard; |
||
类 lock_guard
是互斥体包装器,为在作用域块期间占有互斥提供便利 RAII 风格机制。
创建 lock_guard
对象时,它试图接收给定互斥的所有权。控制离开创建 lock_guard
对象的作用域时,销毁 lock_guard
并释放互斥。
lock_guard
类不可复制。
模板形参
Mutex | - | 要锁定的互斥。类型必须满足基本可锁定 (BasicLockable) 要求 |
成员类型
成员类型 | 定义 |
mutex_type
|
Mutex |
成员函数
构造 lock_guard ,可选地锁定给定的互斥 (公开成员函数) | |
析构 lock_guard 对象,解锁底层互斥 (公开成员函数) | |
operator= [被删除] |
不可复制赋值 (公开成员函数) |
示例
运行此代码
#include <thread> #include <mutex> #include <iostream> int g_i = 0; std::mutex g_i_mutex; // 保护 g_i void safe_increment() { std::lock_guard<std::mutex> lock(g_i_mutex); ++g_i; std::cout << std::this_thread::get_id() << ": " << g_i << '\n'; // g_i_mutex 在锁离开作用域时自动释放 } int main() { std::cout << "main: " << g_i << '\n'; std::thread t1(safe_increment); std::thread t2(safe_increment); t1.join(); t2.join(); std::cout << "main: " << g_i << '\n'; }
可能的输出:
main: 0 140641306900224: 1 140641298507520: 2 main: 2
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2981 | C++17 | 曾提供来自 lock_guard<Mutex> 的冗余推导指引
|
已移除 |
参阅
(C++11) |
实现可移动的互斥体所有权包装器 (类模板) |
(C++17) |
用于多个互斥体的免死锁 RAII 封装器 (类模板) |