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 封装器
(类模板)

版本历史

  • (当前 | 先前 2017年11月20日 (一) 21:10Fruderica讨论 | 贡献 . . (1,989字节) (+183). . (dr) (撤销)
  • 当前 | 先前 2017年11月20日 (一) 21:07Fruderica讨论 | 贡献 . . (1,806字节) (-99). . (撤销)
  • 当前 | 先前 2017年8月25日 (五) 11:04Fruderica讨论 | 贡献. . (1,905字节) (-401). . (撤销)
  • 当前 | 先前 2013年7月2日 (二) 11:32P12bot讨论 | 贡献 . . (2,306字节) (-65). . (Use {{lc}}. Update links. Various fixes.) (撤销)
  • 当前 | 先前 2012年11月2日 (五) 19:46P12bot讨论 | 贡献 . . (2,371字节) (+233). . (r2.7.3) (机器人添加:de, en, es, fr, it, ja, pt, ru) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 03:08P12讨论 | 贡献 . . (2,138字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前) 2012年10月25日 (四) 12:00TranslationBot讨论 | 贡献. . (2,138字节) (+2,138). . (Translated from the English version using Google Translate)