std::lock_guard

来自cppreference.com
< cpp‎ | thread
 
 
并发支持库
线程
(C++11)
(C++20)
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中弃用)
(C++11)(C++20 中弃用)
原子操作的自由函数
原子标志的自由函数
内存序
互斥
(C++11)
通用锁管理
lock_guard
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩与屏障
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
 
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=
[被删除]
不可复制赋值
(公开成员函数)

注解

std::scoped_lock 给出 lock_guard 的一种替代,用避免死锁的算法提供锁定多个互斥体的能力。

(C++17 起)

示例

#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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2981 C++17 曾提供来自 lock_guard<Mutex> 的冗余推导指引 已移除

参阅

实现可移动的互斥体所有权包装器
(类模板)
用于多个互斥体的免死锁 RAII 封装器
(类模板)