`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,可以显著提高代码的安全性和可维护性。

相关推荐
zh_xuan4 小时前
c++ 单例模式
开发语言·c++·单例模式
利刃大大6 小时前
【在线五子棋对战】二、websocket && 服务器搭建
服务器·c++·websocket·网络协议·项目
喜欢吃燃面6 小时前
C++刷题:日期模拟(1)
c++·学习·算法
SHERlocked936 小时前
CPP 从 0 到 1 完成一个支持 future/promise 的 Windows 异步串口通信库
c++·算法·promise
虚拟之7 小时前
36、stringstream
c++
我很好我还能学8 小时前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
南岩亦凛汀9 小时前
在Linux下使用wxWidgets进行跨平台GUI开发
c++·跨平台·gui·开源框架·工程实战教程
曦月逸霜9 小时前
第34次CCF-CSP认证真题解析(目标300分做法)
数据结构·c++·算法
galaxy_strive9 小时前
绘制饼图详细过程
开发语言·c++·qt
Unpredictable22211 小时前
【VINS-Mono算法深度解析:边缘化策略、初始化与关键技术】
c++·笔记·算法·ubuntu·计算机视觉