全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-690-7320

c++ std::mutex和std::lock_guard怎么用_c++互斥锁机制与线程同步实例

std::mutex和std::lock_guard用于C++线程同步,前者提供加锁解锁功能,后者通过RAII机制自动管理锁,防止数据竞争。

c++ std::mutex和std::lock_guard怎么用_c++互斥锁机制与线程同步实例

在C++多线程编程中,std::mutex 和 std::lock_guard 是实现线程同步的基本工具。它们用于保护共享数据,防止多个线程同时访问导致数据竞争和未定义行为。

std::mutex:互斥锁的基本使用

std::mutex 是一个同步原语,用来确保同一时间只有一个线程可以进入临界区(即访问共享资源的代码段)。

常用成员函数:

  • lock():获取锁,如果已被其他线程持有,则阻塞当前线程。
  • unlock():释放锁,必须由持有锁的线程调用。
  • try_lock():尝试获取锁,不阻塞;成功返回 true,否则返回 false。

直接使用 lock/unlock 容易出错,比如忘记 unlock 或异常导致提前退出。因此推荐配合 RAII 机制使用。

std::lock_guard:自动管理锁的生命周期

std::lock_guard 是一个RAII风格的锁管理类。它在构造时自动加锁,析构时自动解锁,确保即使发生异常也能正确释放锁。

使用步骤:

小云雀 小云雀

剪映出品的AI视频和图片创作助手

小云雀 1949 查看详情 小云雀
  • 定义一个 std::mutex 成员或变量。
  • 在需要保护的代码块中创建 std::lock_guard 对象,传入 mutex。
  • 作用域结束时,lock_guard 自动析构并释放锁。

线程同步实例:银行账户存取款模拟

下面是一个使用 std::mutex 和 std::lock_guard 保护共享账户余额的完整例子:

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

class BankAccount {
private:
    double balance;
    std::mutex mtx;  // 互斥锁

public:
    BankAccount(double initial) : balance(initial) {}

    void deposit(double amount) {
        std::lock_guard<std::mutex> lock(mtx);  // 自动加锁
        balance += amount;
        std::cout << "Deposited " << amount 
                  << ", new balance: " << balance << std::endl;
    }

    void withdraw(double amount) {
        std::lock_guard<std::mutex> lock(mtx);
        if (balance >= amount) {
            balance -= amount;
            std::cout << "Withdrew " << amount 
                      << ", new balance: " << balance << std::endl;
        } else {
            std::cout << "Failed to withdraw " << amount 
                      << ", insufficient funds" << std::endl;
        }
    }

    double get_balance() const {
        std::lock_guard<std::mutex> lock(mtx);
        return balance;
    }
};

void worker(BankAccount& account) {
    for (int i = 0; i < 5; ++i) {
        account.deposit(100);
        account.withdraw(50);
    }
}

int main() {
    BankAccount account(1000);
    std::vector<std::thread> threads;

    // 创建 3 个线程同时操作账户
    for (int i = 0; i < 3; ++i) {
        threads.emplace_back(worker, std::ref(account));
    }

    for (auto& t : threads) {
        t.join();
    }

    std::cout << "Final balance: " << account.get_balance() << std::endl;
    return 0;
}

输出示例(顺序可能不同):

Deposited 100, new balance: 1100
Withdrew 50, new balance: 1050
Deposited 100, new balance: 1150
...
Final balance: 1750

由于每个操作都被 std::lock_guard 保护,不会出现余额计算错误或打印混乱的情况。

注意事项与最佳实践

使用互斥锁时要注意以下几点:

  • 避免死锁:多个 mutex 时要始终按相同顺序加锁。
  • 锁的粒度不宜过大,否则影响并发性能。
  • 不要在持有锁时执行耗时操作(如 I/O、网络请求)。
  • 尽量使用 std::lock_guard 或 std::scoped_lock,避免手动调用 lock/unlock。
  • const 成员函数若需加锁,应将 mutex 定义为 mutable。

基本上就这些。std::mutex 配合 std::lock_guard 提供了简单可靠的线程安全机制,是C++多线程编程的基石之一。

以上就是c++++ std::mutex和std::lock_guard怎么用_c++互斥锁机制与线程同步实例的详细内容,更多请关注其它相关文章!


# 多个  # 游戏起名网站建设  # 汽车网站建设推广哪家好  # 聊城全国网站推广机构  # 政和公司seo  # 邱县网络营销seo  # 景区推广电商营销方案  # 团风seo推广介绍  # 宜春一站式seo优化  # 米业网站建设单价  # 兰州爱采购seo  # 有什么区别  # 时要  # 死锁  # 工具  # 如何实现  # 多线程  # 如何使用  # 互斥  # 加锁  # 是一个  # 有锁  # 作用域  # stream  # ios  # c++  # ai 


相关文章: Go语言中动态执行代码字符串的策略与实践  J*aScript中向JSON对象添加新属性的正确姿势  格力空气能E5故障代码是什么情况_格力空气能E5代码解析与应对措施  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  12306几点到几点不能订票? | 官方最新系统维护时间全解析  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  解决Flask中Quill编辑器内容提交失败及TypeError的指南  漫蛙2网页版漫画入口 漫蛙漫画在线官方登录  在命令行怎么运行html项目_命令行运行html项目方法【教程】  苹果手机如何防止被恶意App追踪  Python实现多节点属性重叠度分析教程  PySpark中从现有列右侧提取可变长度字符创建新列的教程  蛙漫画网页版全站入口 蛙漫热门作品免费浏览  192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  excel怎么提取文本中数字 excel函数提取技巧  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  优化大型XML文件解析:基于Python流式处理的内存高效方案  J*a初级项目如何接入API数据_第三方接口请求与响应解析  win11怎么清理更新缓存 Win11删除Windows Update下载文件释放空间【技巧】  Go语言中JSON数据解析与字段访问教程  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  拼多多视频播放卡顿如何处理 拼多多视频播放优化技巧  C++编译期如何执行复杂计算_C++模板元编程(TMP)技巧与应用  Lar*el头像管理:图片缩放与旧文件删除的最佳实践  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  服务端验证_j*ascript输入检查  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  微信群消息显示延迟如何解决 微信群消息刷新优化方法  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  GemBox Document HTML转PDF垂直文本渲染问题及解决方案  腾讯视频怎么举报不良内容_腾讯视频内容举报流程与违规信息处理方法  Archive of Our Own官网直达 AO3最新可用地址一览  知音漫客官网漫画下载_知音漫客网页版阅读记录  EMS快递官网app_中国邮政速递物流手机客户端  MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令  蛙漫漫画免费阅读入口_蛙漫官方正版无广告纯净版  Python自定义类排序:解决lambda键值访问TypeError的实践指南  解决macOS上安装pyhdf时‘hdf.h’文件缺失的编译错误  AO3官方可用镜像 Archive of Our Own网页版最新入口  C++如何操作注册表_Windows平台下C++读写注册表的API函数详解  微博网页版首页入口 微博电脑端官网登录链接  b站怎么看视频的弹幕数量_b站弹幕数量查看方法  新手怎么开始学化妆 零基础化妆入门教程  抖音隐秘迷城小游戏入口_ 抖音冒险解谜小游戏秒玩  Go Martini框架:动态服务解码后的图片内容  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  AO3最新官网入口公告_2025AO3镜像站实时查询方法  WordPress插件开发:正确注册卸载钩子与避免常见陷阱 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。