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


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

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

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

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

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

常用成员函数:

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

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

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

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

使用步骤:

Primeshot Primeshot

专业级AI人像摄影工作室

Primeshot 36 查看详情 Primeshot
  • 定义一个 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++互斥锁机制与线程同步实例的详细内容,更多请关注其它相关文章!


# ai  # 死锁  # 数据结构  # 多个  # 自己的  # 多线程  # 互斥  # 加锁  # 如何使用  # 有锁  # 作用域  # stream  # ios  # c++  # 工具  # 是一个  # 衢州本地的网站建设  # 孝感seo推广排名前十  # 广州seo就业前景  # 太原旅游网站建设  # 文案seo指什么  # 宝山营销推广培训班  # 玉林附近seo推广  # seo成长空间  # 龙井网站推广方案  # 泰安网站建设怎么样  # 高性能 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: PHP中动态类名访问的类实例类型提示与静态分析实践  猫眼电影app怎么查询电影院的营业时间_猫眼电影影院营业时间查询教程  折叠屏手机充不进电是什么问题? 特殊结构带来的维修难点  被称为海蜈蚣的海洋动物是  快手极速版在线体验区 快手极速版网页体验入口  《金山词霸》语音翻译方法  荣耀magicv5怎么上手测评  支付宝网页版在线入口 支付宝官网电脑登录入口  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  泰拉瑞亚水晶无法放置问题  解决Go encoding/json 将JSON大数字解析为浮点数的问题  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  iPhone14开启Apple TV遥控设置  漫蛙漫画官方网站使用_漫蛙manwa网页版在线入口教程  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  c++如何链接Boost库_c++准标准库的集成与使用  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  J*a实现任务清单管理_集合框架综合入门练手  如何使用CSS Grid实现“大方块左侧,小方块右侧垂直堆叠”的水平布局  重返未来:1999卡戎全方位攻略  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  漫蛙官网(首页入口)_漫蛙漫画稳定访问教程分享  PHP页面重载后变量状态保持:实现用户档案连续浏览的教程  《大学搜题酱》官网地址登录  《虎扑》关闭社区内容推荐方法  Magento 2 产品保存事件中安全更新属性的最佳实践  Firefox OS应用开发:解决XMLHttpRequest跨域请求阻塞问题  SQL聚合查询、联接与筛选:GROUP BY 子句的正确使用与常见陷阱  精通VS Code多光标编辑以实现闪电般快速的修改  漫蛙manwa漫画官网链接_漫蛙manwa最新可用网址推荐  猫眼app抢票快还是小程序快  微博网页版访问入口 微博网页版网页端使用指南  163邮箱在线登录 163邮箱网页版在线入口  之了课堂app做题入口  VS Code源代码管理(SCM)视图的进阶使用技巧  windows10怎么更改下载路径_windows10默认存储位置修改教程  Flash AS3.0简易相册制作  在VS Code中利用AI辅助进行代码迁移  雨课堂官网在线登录 网页版雨课堂登录链接  学习通网页版课程打不开_课程无法访问时的解决方法  家里的小飞虫总是不断,用什么方法可以彻底根除?  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  PHP动态导航按钮:根据用户登录状态切换链接与文本  Win11怎么录屏_Windows 11自带Xbox Game Bar录制视频  MacBook Pro词典使用指南  Mac怎么关闭按键声音_Mac键盘打字音效设置  PHP页面重载时变量值不重置的实现方法  sublime如何自定义文件类型图标_AFileIcon插件的主题切换与个性化配置  12306APP选座怎么选充电位置_12306APP带充电插座座位选择方法与技巧  鸿蒙单条备忘录如何加密 

 2025-11-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.