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

在C++多线程编程中,std::mutex 和 std::lock_guard 是实现线程同步的基本工具。它们用于保护共享数据,防止多个线程同时访问导致数据竞争和未定义行为。
std::mutex 是一个同步原语,用来确保同一时间只有一个线程可以进入临界区(即访问共享资源的代码段)。
常用成员函数:
直接使用 lock/unlock 容易出错,比如忘记 unlock 或异常导致提前退出。因此推荐配合 RAII 机制使用。
std::lock_guard 是一个RAII风格的锁管理类。它在构造时自动加锁,析构时自动解锁,确保即使发生异常也能正确释放锁。
使用步骤:
Primeshot
专业级AI人像摄影工作室
36
查看详情
下面是一个使用 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由于每个操作都被 std::lock_guard 保护,不会出现余额计算错误或打印混乱的情况。
使用互斥锁时要注意以下几点:
基本上就这些。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
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。