std::lock_guard

来自cppreference.com
< cpp‎ | thread
定义于头文件 <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> 的冗余推导指引 已移除

[编辑] 参阅

实现可移动的互斥锁有权包装器
(类模板) [编辑]
多互斥的免死锁 RAII 封装器
(类模板) [编辑]