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 用于保护标准输出流,确保在多线程环境中输出不会交叉或混乱。当进入 printEvenprintOdd 函数时,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 用于自动管理互斥量的锁定和解锁,提供了一种安全、简洁且异常安全的方式来处理多线程中的同步问题。通过它的构造函数和析构函数,它能保证互斥量在进入和离开作用域时自动加锁和解锁,从而避免了忘记解锁互斥量导致的潜在问题。

相关推荐
tan180°16 分钟前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
彭祥.2 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk2 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
胖大和尚4 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
钱彬 (Qian Bin)5 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶8365 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸6 小时前
C++高频知识点(二)
开发语言·c++·经验分享
jyan_敬言7 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
liulilittle8 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
tan77º8 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp