std::lock_guard 是 C++ 标准库中,用于简化互斥量的管理。它提供了一个异常安全的方式来锁定和自动解锁互斥量。

文章目录

      • [示例 1:基本用法](#示例 1:基本用法)
      • [示例 2:保护共享资源](#示例 2:保护共享资源)
      • 小结

std::lock_guard 是 C++ 标准库中的一个实用工具,用于简化互斥量的管理。它提供了一个异常安全的方式来锁定和自动解锁互斥量。

示例 1:基本用法

c++ 复制代码
#include <iostream>
#include <mutex>
#include <thread>

std::mutex mtx; // 全局互斥量

void printEven(int num) {
    std::lock_guard<std::mutex> guard(mtx); // 在作用域开始时自动加锁
    if (num % 2 == 0) {
        std::cout << num << " is even." << std::endl;
    }
    // 离开作用域时,guard会自动解锁mtx
}

void printOdd(int num) {
    std::lock_guard<std::mutex> guard(mtx);
    if (num % 2 != 0) {
        std::cout << num << " is odd." << std::endl;
    }
}

int main() {
    std::thread t1(printEven, 2);
    std::thread t2(printOdd, 3);

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

    return 0;
}

在这个例子中,std::lock_guard 用于保护标准输出流,确保在多线程环境中输出不会交叉或混乱。当进入 printEven 或 printOdd 函数时,std::lock_guard 会自动锁定互斥量 mtx。当函数结束,即离开作用域时,锁会自动释放。

示例 2:保护共享资源

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

std::mutex mtx; // 全局互斥量
std::vector<int> shared_data; // 共享资源

void addData(int data) {
    std::lock_guard<std::mutex> guard(mtx);
    shared_data.push_back(data);
    std::cout << "Data added: " << data << std::endl;
}

int main() {
    std::thread t1(addData, 10);
    std::thread t2(addData, 20);

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

    return 0;
}

在这个例子中,std::lock_guard 用于保护对共享资源 shared_data 的访问。每当一个线程尝试添加数据到 shared_data 时,它会通过 std::lock_guard 锁定互斥量,以确保在添加数据的过程中不会有其他线程同时修改 shared_data。

小结

在这两个例子中,std::lock_guard 用于自动管理互斥量的锁定和解锁,提供了一种安全、简洁且异常安全的方式来处理多线程中的同步问题。通过它的构造函数和析构函数,它能保证互斥量在进入和离开作用域时自动加锁和解锁,从而避免了忘记解锁互斥量导致的潜在问题。

相关推荐
努力实干2 小时前
面向对象设计原则——C++
开发语言·c++·数码相机
syagain_zsx5 小时前
jsoncpp 使用指南:编译链接、Json::Value 取值与高频坑
c++·json·库·http格式
布莱克6056 小时前
理解 = delete 与 = default:两种赋值语义的差异
c++
小小、码农7 小时前
[特殊字符]【C++11】类的新功能全面解析:移动构造、移动赋值、default、delete、final 与 override
linux·开发语言·网络·c++
库玛西8 小时前
外部排序全解析:败者树、置换-选择排序与最佳归并树
c语言·数据结构·c++·笔记·考研·算法
General_G9 小时前
创建型模式—原型(Prototype)模式
c++·设计模式·原型模式
syagain_zsx9 小时前
protobuf 实战:从 .proto 到 C++ 序列化的完整链路
c++·学习·程序人生·谷歌·protobuf
welfare96210 小时前
新号别搞:C++_list
开发语言·c++
xiaoye-duck10 小时前
《C++ 项目:手写大模型接入 SDK》云端 API 调用基础与 Apifox 调试实战
网络·c++·语言模型
坤坤子吖10 小时前
Linux 线程同步与互斥——条件变量与线程同步
linux·开发语言·c++·笔记·学习