0

0

C++怎么使用互斥锁_C++多线程安全教程【同步】

冰火之心

冰火之心

发布时间:2026-02-25 15:27:26

|

552人浏览过

|

来源于php中文网

原创

std::mutex必须配合raii类(如std::lock_guard或std::unique_lock)使用,裸调lock()/unlock()易因异常、提前return等导致死锁;多锁需统一顺序或用std::scoped_lock避免ab-ba死锁;mutex不可复制移动,应为private成员并禁用拷贝;递归需求才用std::recursive_mutex;关键在合理界定共享数据与临界区粒度。

c++怎么使用互斥锁_c++多线程安全教程【同步】

std::mutex 必须配合 std::lock_guard 或 std::unique_lock 使用

直接调用 mutex.lock()mutex.unlock() 极易出错——忘记 unlock、提前 return、抛异常都会导致死锁。C++ 标准库不推荐裸调用,而是靠 RAII 自动管理生命周期。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • std::lock_guard<:mutex></:mutex> 最常用:构造即加锁,析构即解锁,不能转移,轻量且安全
  • std::unique_lock<:mutex></:mutex> 用于需要延迟加锁、手动解锁、或配合条件变量的场景
  • 永远不要在同一个线程里对已持有的 std::mutex 再次调用 lock() —— 这是未定义行为,多数实现会死锁

多个 mutex 加锁顺序不一致会引发死锁

两个线程分别按不同顺序获取 mtx_amtx_b,比如线程1先锁 a 再锁 b,线程2先锁 b 再锁 a,就可能互相等待对方释放——典型 AB-BA 死锁。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 所有代码路径中,对一组 mutex 的加锁顺序必须严格一致(例如始终按地址大小排序)
  • std::scoped_lock(C++17 起)一次性加多个锁,它内部自动按地址排序并避免死锁:std::scoped_lock lock(mtx_a, mtx_b);
  • 旧标准可用 std::lock(mtx_a, mtx_b) + std::lock_guard 的组合,但更啰嗦

std::mutex 不可复制、不可移动,别传值或存 vector

常见错误:把 std::mutex 成员变量设为 public,然后意外被拷贝;或试图 std::vector<:mutex></:mutex> —— 编译直接失败,因为 std::mutex 删除了拷贝和移动构造函数。

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载

实操建议:

立即学习C++免费学习笔记(深入)”;

  • mutex 应作为类的 private 成员,且类本身也应禁用拷贝(显式删除 MyClass(const MyClass&) = delete;
  • 需要 N 个互斥资源?用 std::vector<:unique_ptr>></:unique_ptr> 或静态数组,而不是直接存对象
  • 跨线程共享 mutex?不行——mutex 只能在线程内持有,且不能跨线程传递所有权;它只是同步原语,不是数据载体

递归锁不是默认选项,std::recursive_mutex 要主动选

有些场景确实需要同一线程多次进入临界区(比如递归函数调用),但 std::mutex 不支持。有人误以为“加锁两次就自动递归”,结果程序卡死。

实操建议:

立即学习C++免费学习笔记(深入)”;

  • 明确需要递归语义时,才用 std::recursive_mutex,并配 std::lock_guardstd::unique_lock
  • 注意性能开销:递归锁内部要维护计数器和持有线程 ID,比普通 std::mutex
  • 绝大多数业务逻辑不需要递归锁——重新设计函数边界、提取临界区外的公共逻辑,通常比用递归锁更清晰、更安全

真正难的不是写对 lock/unlock,而是判断哪段数据算“共享”、哪个粒度该加锁、以及锁住之后是否还调用了可能阻塞或抛异常的第三方代码——这些地方一漏,std::mutex 就成了幻觉。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

552

2023.09.20

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

720

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

371

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

27

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

25

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

100

2026.02.06

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.12.29

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

65

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号