首页/新闻资讯/正文详情

C++ 互斥锁(Mutex)与临界区(Critical Section):std::mutex 与 std::lock_guard

发布时间:2026/11/5 2:02:43 来源:云帆数科 栏目:资讯中心
C++ 互斥锁(Mutex)与临界区(Critical Section):std::mutex 与 std::lock_guard
C 互斥锁Mutex与临界区Critical Sectionstd::mutex 与 std::lock_guardflyfish先看没有锁会怎样#includeiostream#includethread#includevectorintcounter0;// 两个线程同时 数据竞争intmain(){std::vectorstd::threadthreads;for(inti0;i10;i){threads.emplace_back([]{for(intj0;j10000;j){counter;// 不是原子操作多个线程同时执行会丢更新}});}for(autot:threads)t.join();std::coutcounter counter\n;// 期望 100000实际小于它return0;}counter 的 分三步读旧值、加一、写回。两个线程同时读到同一个旧值各加一次再写回其中一次更新就丢了。数据竞争的结果是未定义行为数值不对只是最常见的表现。术语对照表中文术语英文术语定义临界区Critical Section访问共享资源的代码段同一时刻只允许一个线程进入互斥锁 / 互斥量Mutex (Mutual Exclusion)保证临界区互斥访问的同步原语锁管理RAII 包装Lock Guard / RAII Wrapper构造时加锁、析构时解锁的自动管理机制数据竞争Data Race多个线程同时访问同一内存且至少一个为写操作且无同步机制死锁Deadlock多个线程互相持有对方所需锁而永久阻塞的状态锁粒度Lock Granularity临界区覆盖代码范围的大小细粒度代表更小的临界区未定义行为Undefined Behavior (UB)标准未规定结果的行为数据竞争即属此类一、概述互斥锁Mutex是最基础的同步原语其职责是保证**临界区Critical Section**的互斥访问任意时刻临界区至多允许一个线程进入其余线程在锁上阻塞等待。std::mutex 是 C 标准库对互斥锁的正式实现。std::lock_guard 是它的标准配套管理工具用于以 RAII 方式自动释放锁消除手动解锁引入的死锁风险。二、原理2.1 互斥性互斥锁维护一个逻辑状态已锁定locked或未锁定unlocked。线程在进入临界区前必须先获得锁持锁期间其他线程的加锁请求被阻塞直到持锁线程解锁。2.2 数据竞争的本质未加锁时对共享变量的读改写操作可能被其他线程交错执行。以自增操作为例其底层包含读取、修改、写回三个步骤。两个线程同时执行时可能读取同一旧值各自写回导致一次更新丢失。C 标准将此类无同步的数据竞争定义为未定义行为其结果不可预测。三、接口规范std::mutex 提供三个成员方法接口语义阻塞行为lock()获取锁阻塞直至获得锁unlock()释放锁无阻塞持锁线程调用try_lock()尝试获取锁非阻塞未获得立即返回 false四、使用方式4.1 不推荐手动加锁std::mutex mtx;intcounter0;voidincrement(){mtx.lock();counter;mtx.unlock();// 必须保证所有执行路径都调用否则死锁}手动加锁存在两类固有风险其一分支提前返回导致解锁语句被跳过锁永久持有其余线程无限阻塞其二临界区抛出异常时解锁语句不执行同样导致锁泄漏。这两类风险均源于解锁依赖程序员在每条路径上手动执行。4.2 推荐RAII 自动管理#includemutexstd::mutex mtx;intcounter0;voidincrement(){std::lock_guardstd::mutexlock(mtx);// 构造加锁counter;// 临界区}// 析构无条件解锁std::lock_guard 构造时调用 lock()析构时调用 unlock()。C 保证局部对象在作用域退出时析构无论退出路径为正常返回、提前 return 或异常传播。解锁因此成为编译器保证执行的确定性行为。4.3 临界区粒度控制临界区应保持最小化仅覆盖对共享资源的访问不包含与共享状态无关的耗时计算std::mutex mtx;Data shared_data;voidprocess(){Data snapshot;{std::lock_guardstd::mutexlock(mtx);snapshotshared_data;// 临界区仅限此行}expensive_computation(snapshot);// 锁外执行不阻塞其他线程}std::lock_guard把解锁绑定到析构lock_guard 的原理只有一句话构造时加锁析构时解锁中间什么都不管。#includeiostream#includemutex#includethread#includevectorintcounter0;std::mutex mtx;voidaddOne(){std::lock_guardstd::mutexlock(mtx);// 构造加锁counter;// 临界区// 析构无论怎么离开这里都会解锁}intmain(){std::vectorstd::threadthreads;for(inti0;i10;i){threads.emplace_back([]{for(intj0;j10000;j)addOne();});}for(autot:threads)t.join();std::coutcounter counter\n;// 稳定输出 100000return0;}

相关推荐

Python 写的 Linux 监控小工具:磁盘、CPU、内存一屏看住
Python 写的 Linux 监控小工具:磁盘、CPU、内存一屏看住

服务器跑着跑着突然卡死,登录上去才发现磁盘满了、内存被吃光——这种场景相信不少运维和开发同学都遇到过。为了少踩坑,我用 Python 写了一个轻量的 Linux 监控小工具,日常用下来还算顺手,这里分享给大家。 它能做什么 三项核心… · 2026/11/5 2:01:42

大模型入门必看:揭秘AI的“无所不知”与“潜藏”的真相,小白也能轻松收藏学习!
大模型入门必看:揭秘AI的“无所不知”与“潜藏”的真相,小白也能轻松收藏学习!

本文深入浅出地解释了大模型的工作原理,指出它们通过海量阅读和计算文字搭配概率来生成回答,而非真正理解世界。文章还探讨了深度学习和强化学习在大模型训练中的应用,以及大模型对产品设计和交互范式的革命性影响。最后,文章强调… · 2026/11/5 2:01:42

鲜料冷萃的成本账:干燥、水、浓缩、设备,逐项摊开算 ——药食同源鲜料冷萃系列(连载五)
鲜料冷萃的成本账:干燥、水、浓缩、设备,逐项摊开算 ——药食同源鲜料冷萃系列(连载五)

鲜料冷萃的成本账:干燥、水、浓缩、设备,逐项摊开算 ——药食同源鲜料冷萃系列(连载五) 本篇问题词: 鲜料冷萃 成本 / 湿法研磨 能耗 对比 / 料水比 蒸发成本 / 研磨设备 投资回报 上一篇: 连载四讲了怎么验… · 2026/11/5 2:01:42

Blender渲染参数与出图流程:引擎、采样、光程、降噪与提速
Blender渲染参数与出图流程:引擎、采样、光程、降噪与提速

1. 先把“渲染”这件事拆成三层来看很多人第一次点开 Blender 的渲染面板,会被密密麻麻的折叠菜单劝退,其实真正影响一张简单静物图成色的,就那么十来个参数。渲染在 Blender 里不是“一个按钮”,而是三层不同性质的东西叠在一起&… · 2026/11/5 2:40:02

MySQL 5.7到8.0语法兼容性实战指南
MySQL 5.7到8.0语法兼容性实战指南

1. 项目背景与核心需求最近在接手一个遗留系统迁移项目时,遇到了一个典型的技术兼容性问题:新服务器默认安装的MySQL 8.0版本无法直接运行旧系统为MySQL 5.7设计的SQL语句。这让我不得不深入研究高版本MySQL向低版本兼容的具体方案。MySQL从5.7升级到8.0… · 2026/11/5 2:40:02

打印机无法扫描的四大根因与实战排查指南
打印机无法扫描的四大根因与实战排查指南

1. 项目概述:为什么“打印机无法扫描”是高频痛点,而不是小故障“打印机无法扫描”这六个字,每天在各大技术论坛、客服后台、社区群组里出现的频次,远超多数人的想象。它不像“打印卡纸”那样有明确的物理反馈,也不像“… · 2026/11/5 2:40:02

汽车产业数字化转型:从研发到生产的全链路重构
汽车产业数字化转型:从研发到生产的全链路重构

1. 汽车产业数字化转型全景图最近三年走访了17家主机厂和34家零部件供应商后,我清晰地看到生产线上的机械臂正在被数据流重新定义。某德系豪华品牌工厂里,焊装车间的设备综合效率(OEE)通过数字孪生技术提升了23%,这个案… · 2026/11/5 2:40:02

Blender简单渲染全流程:引擎选型、灯光构图与噪点排查
Blender简单渲染全流程:引擎选型、灯光构图与噪点排查

很多人学 Blender 的第一道坎不是建模,是渲染。模型搭完了,材质随手一贴,按下 F12,结果出来一张灰蒙蒙、噪点满屏、构图还歪着的图,于是开始怀疑自己是不是不适合干这行。我第一次渲染的时候更惨,画面黑得只… · 2026/11/5 2:40:02

PhaaS钓鱼即服务产业链解析与防御策略
PhaaS钓鱼即服务产业链解析与防御策略

1. 事件背景与行业影响2023年第三季度,一场针对跨国短信钓鱼团伙的全球打击行动引发安全行业震动。这个被安全研究人员称为"PhaaS三人组"(Phishing-as-a-Service)的犯罪集团,在过去18个月内构建了完整的钓鱼即服务产业链… · 2026/11/5 2:39:01

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码