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

在C++多线程编程中,std::mutex 和 std::lock_guard 是实现线程同步的基本工具。它们用于保护共享数据,防止多个线程同时访问导致数据竞争和未定义行为。
std::mutex 是一个同步原语,用来确保同一时间只有一个线程可以进入临界区(即访问共享资源的代码段)。
常用成员函数:
直接使用 lock/unlock 容易出错,比如忘记 unlock 或异常导致提前退出。因此推荐配合 RAII 机制使用。
std::lock_guard 是一个RAII风格的锁管理类。它在构造时自动加锁,析构时自动解锁,确保即使发生异常也能正确释放锁。
使用步骤:
小云雀
剪映出品的AI视频和图片创作助手
1949
查看详情
下面是一个使用 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() << st
d::endl;
return 0;
}
输出示例(顺序可能不同):
Deposited 100, new balance: 1100由于每个操作都被 std::lock_guard 保护,不会出现余额计算错误或打印混乱的情况。
使用互斥锁时要注意以下几点:
基本上就这些。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小时内与您取得联系。