`std::lock_guard<std::mutex>` 是 C++11 引入的一种 RAII(资源获取即初始化)风格的锁管理器

std::lock_guard<std::mutex> 是 C++11 引入的一种 RAII(资源获取即初始化)风格的锁管理器,用于简化互斥锁的管理,确保在离开作用域时自动释放锁,避免死锁。以下是对 std::lock_guard<std::mutex> 的详细解释:

1. 基本用法

cpp 复制代码
#include <iostream>
#include <mutex>

std::mutex mutex_;

void safe_function() {
    std::lock_guard<std::mutex> lock(mutex_); // 获取锁
    // 临界区代码
    std::cout << "Inside critical section" << std::endl;
} // lock 在这里被销毁,自动释放锁

在上述代码中,std::lock_guard<std::mutex> 的构造函数会自动获取 mutex_ 的锁,当 lock 离开作用域时(即函数结束时),其析构函数会自动释放锁。

2. 作用

  • 自动加锁和解锁std::lock_guard 的构造函数会自动加锁,析构函数会自动解锁。
  • 防止死锁:通过确保锁在作用域结束时自动释放,避免因忘记解锁而导致的死锁问题。
  • 异常安全:即使在临界区发生异常,锁也会在作用域结束时自动释放。

3. 成员函数

std::lock_guard 没有公开的成员函数,它的操作主要通过构造函数和析构函数完成。

4. 示例代码

以下是一个完整的示例,展示了如何使用 std::lock_guard 来保护共享资源:

cpp 复制代码
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

std::mutex mutex_;
int shared_resource = 0;

void increment() {
    for (int i = 0; i < 1000; ++i) {
        std::lock_guard<std::mutex> lock(mutex_); // 获取锁
        ++shared_resource;
    }
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    std::cout << "Final value: " << shared_resource << std::endl; // 输出 2000

    return 0;
}

在上述代码中,两个线程同时访问和修改共享资源 shared_resource,通过 std::lock_guard 确保每次只能有一个线程进入临界区,从而避免数据竞争。

5. 与其他锁管理器的比较

  • std::lock_guard:简单,自动管理锁,适合大多数场景。
  • std::unique_lock:功能更强大,支持延迟加锁、解锁、移动语义等,但稍微复杂一些。

6. 底层机制

std::lock_guard 的构造函数调用 std::mutexlock() 方法,析构函数调用 std::mutexunlock() 方法。这确保了即使在异常情况下,锁也能被正确释放。

7. 总结

  • std::lock_guard<std::mutex> 是一种简单的 RAII 风格的锁管理器。
  • 它确保在进入作用域时自动加锁,在离开作用域时自动解锁。
  • 它非常适合保护临界区,避免死锁和数据竞争。
  • 在需要更复杂的功能时,可以考虑使用 std::unique_lock

通过使用 std::lock_guard,可以显著提高代码的安全性和可维护性。

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·2 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
程序猿编码2 天前
告别改源码适配模型:纯 C++ 可配置 LLM 推理引擎,全格式全结构兼容
c++·大模型·llm·推理引擎
此生决int2 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++