新闻中心
C++如何使用互斥锁(std::mutex)保护共享数据_C++多线程数据同步方法
使用std::mutex和std::lock_guard可防止多线程数据竞争,通过RAII机制自动加解锁,确保共享数据安全,最终正确输出预期结果1000000。

在C++多线程编程中,多个线程同时访问共享数据可能导致数据竞争和未定义行为。为确保线程安全,可以使用 std::mutex 对共享资源进行保护。通过加锁和解锁机制,确保同一时间只有一个线程能访问临界区代码。
1. 包含头文件并声明互斥锁
使用互斥锁前,需要包含相应的头文件,并定义一个 std::mutex 实例来保护共享数据。
#include <iostream> #include <thread> #include <mutex> #include <vector> int shared_data = 0; std::mutex mtx; // 声明互斥锁
2. 在关键代码段中加锁和解锁
当线程要读写共享数据时,必须先获取锁。操作完成后立即释放锁,避免长时间占用导致性能问题。
void increment() {
for (int i = 0; i < 100000; ++i) {
mtx.lock(); // 获取锁
++shared_data; // 安全访问共享数据
mtx.unlock(); // 释放锁
}
}
虽然手动调用 lock() 和 unlock() 是可行的,但容易因异常或提前返回导致忘记解锁,引发死锁。
3. 推荐使用 std::lock\_guard 自动管理锁
std::lock_guard 是RAII(Resource Acquisition Is Initialization)风格的锁管理类,构造时加锁,析构时自动解锁,更安全可靠。
刺鸟创客
一款专业高效稳定的AI内容创作平台
110
查看详情
void increment() {
for (int i = 0; i < 100000; ++i) {
std::lock_guard<std::mutex> guard(mtx);
++shared_data;
// 离开作用域时自动释放锁
}
}
即使在临界区中抛出异常,lock_guard 也能保证锁被正确释放。
4. 创建多个线程验证数据同步效果
启动多个线程并发调用受保护的函数,最终结果应为各线程增量之和。
int main() {
const int num_threads = 10;
std::vector<std::thread> threads;
// 启动10个线程
for (int i = 0; i < num_threads; ++i) {
threads.emplace_back(increment);
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
std::cout << "Final value of shared_data: " << shared_data << std::endl;
return 0;
}
如果没有使用互斥锁,结果通常会远小于预期值(如 10 × 100000 = 1000000)。加上 mutex 后,输出应准确为 1000000。
基本上就这些。合理使用 std::mutex 配合 std::lock_guard,能有效防止数据竞争,实现线程安全的数据同步。不复杂但容易忽略的是:始终避免长时间持有锁,尽量缩小临界区范围以提升并发性能。
以上就是C++如何使用互斥锁
(std::mutex)保护共享数据_C++多线程数据同步方法的详细内容,更多请关注其它相关文章!
# 如何使用
# 网站优化服务图片大全
# 高新网站推广有哪些
# 辽宁网站建设设计定制
# 湖州seo优化费用
# 网站推广优化哪家可靠点
# 怎么进行软文推广营销
# 济南关键词排名引流
# 崇州网站推广活动
# 独立ip做seo
# 辽宁企业营销型网站优化
# 死锁
# 长时间
# 加锁
# ai
# 游戏开发
# 数据同步
# 多个
# 解锁
# 互斥
# 多线程
# 有锁
# red
# 作用域
# stream
# ios
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Django模型中自动计算可用余额的实现方法
Safari浏览器输入栏卡顿如何解决 Safari搜索建议与缓存清理
excel怎么制作工资条 excel快速生成工资条的方法
漫蛙漫画官方主页入口 漫蛙MANWA网页直达访问链接
如何仅使用CSS更改登录界面背景图像图标的颜色
在Socket.IO连接中实现Access Token自动更新与动态重连
必由学网页版入口 必由学官方平台直接访问
漫蛙官网正版漫画入口 漫蛙2官方网页登录地址
Sublime怎么配置Nim语言环境_Sublime Nim代码高亮与补全
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
FullCalendar 自定义按钮样式定制指南
解决Django多数据库/多Schema环境下外键迁移问题
汽水音乐在线解析 汽水音乐在线解析入口
Linux如何构建多环境配置管理_Linux多环境配置方案
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略
CSS Flexbox如何实现多行排列_flex-wrap wrap自动换行显示
一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证
JUnit5/Mockito:优雅测试内部依赖与异常处理的实践
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
单射、满射与双射的关系 一文理清所有逻辑
优化 Python 函数中的条件逻辑:解决 if-else 嵌套与参数选择问题
mcjs网页版在线存档 mcjs云存档登录入口
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
QQ网页版官方账号入口 QQ网页版网页版登录指南
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
Go Martini框架:动态服务解码后的图片内容
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口
知音漫客官网漫画下载_知音漫客网页版阅读记录
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
在J*aScript中复现SciPy的B样条拟合与求值:关键考量
TypeScript/J*aScript:高效查找数组中首个唯一ID对象
Lar*el如何正确地在控制器和模型之间分配逻辑_Lar*el代码职责分离与架构建议
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
163邮箱官方主页登录 直达网易邮箱登录核心页面
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
蛙漫官方正版入口 蛙漫网页在线全集免费观看
Log4j Console Appender性能瓶颈与高并发优化策略
AI抖音网页版免费视频入口 AI抖音网页端最新视频实时观看
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
12306选座系统怎么选连座_12306选座多人连坐操作方法
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
押井守高度称赞《辐射4》:玩了八年都停不下来!
Golang如何使用const iota_Go iota常量计数器讲解
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
Django表单验证失败时保留用户输入数据的最佳实践


2025-11-05
浏览次数:次
返回列表