当前位置: 首页 > news >正文

【Effective Modern C++】第七章 并发API:40. 对于并发使用atomic,对于特殊内存使用volatile

为什么要区分这两个关键字?

volatile之所以被拿来和并发编程混为一谈,是因为:

  • 其他语言(Java/C#)中volatile有并发语义;

  • 部分 C++ 编译器给volatile加了非标准的并发特性;

    但在标准 C++ 中,volatile和并发毫无关系,而开发者常把它和处理并发的std::atomic搞混,这是文章要解决的核心问题。

std::atomic:专为并发设计的原子操作工具

  1. 能力:保证对变量的操作(读、写、读 - 改 - 写)是原子性的(不可分割),无需互斥锁,底层通过专用机器指令实现,比锁更高效。

    • 比如++aiaistd::atomic<int>)是完整的原子操作,多线程执行时不会出现 “读 - 改 - 写” 拆分导致的错误;
    • 对比普通变量 /volatile变量的自增:会拆分成 “读值→加 1→写回” 三步,多线程下会出现计数错误(比如两次自增只得到 1 而非 2)。
  2. 内存序限制:默认的 “顺序一致性” 模型会限制编译器 / 硬件的指令重排,保证操作的执行顺序和代码逻辑一致。

    • 比如先计算imptValue再设置valAvailable = truestd::atomic能保证其他线程不会看到valAvailabletrueimptValue未计算完成的情况;
    • 这是并发通信的关键(比如用标志位通知 “数据已就绪”)。
  3. 限制:删除了拷贝构造 / 赋值函数(避免非原子的拷贝操作破坏线程安全),必须通过load()/store()读写值。

volatile:专为 “特殊内存” 设计的防优化工具

  1. 能力:告诉编译器 “这块内存是特殊的,不要优化看似冗余的读写操作”,仅针对内存优化,和并发无关。

    • 冗余读:auto y = x; y = x;xvolatile int),编译器不会省略第二次读(比如x是温度传感器的内存映射地址,两次读取值可能不同);
    • 冗余写:x = 10; x = 20;,编译器不会省略第一次写(比如x是无线电控制端口,两次赋值是不同指令)。
  2. 局限性

    • 无原子性保证:volatile变量的自增、读写依然是拆分操作,多线程下会出现数据竞争,属于未定义行为;
    • 无指令重排限制:编译器 / 硬件仍可能重排volatile变量的操作顺序,无法保证并发通信的正确性。

std::atomicvsvolatile

特性std::atomicvolatile
目标保证多线程访问的原子性和内存序禁止编译器优化特殊内存的读写
适用场景并发编程(无锁多线程访问变量)特殊内存(内存映射 I/O、外设通信等)
原子性支持(读、写、RMW 操作均原子)不支持
指令重排限制有(默认顺序一致性)
编译器优化允许(比如合并多次load()为一次)禁止(必须保留所有读写)

特殊场景:两者可以结合使用

如果变量同时满足 “需要原子操作” 和 “需要防优化”(比如内存映射 I/O 地址被多线程访问),可以组合声明:

volatile std::atomic<int> vai;
  • std::atomic保证操作的原子性;
  • volatile禁止编译器优化对这块特殊内存的读写。

额外实践建议

显式调用std::atomicload()/store()函数,虽然不是语法必需,但能:

  • 清晰标识变量是 “非普通” 的,便于排查性能瓶颈(原子操作比普通操作慢);
  • 提醒开发者注意并发语义,避免遗漏std::atomic声明导致的并发错误。

总结

  1. std::atomic并发编程工具:解决多线程无锁访问变量的原子性和内存序问题,和特殊内存无关;
  2. volatile特殊内存处理工具:禁止编译器优化冗余读写,和并发安全无关;
  3. 两者核心目标完全不同,不可互相替代,仅在 “特殊内存 + 多线程访问” 的极端场景下组合使用。

原著在线阅读地址

http://www.jsqmd.com/news/423554/

相关文章:

  • 第 13 章:GUI 实战——LVGL 在 STM32MP257 上的硬件加速
  • 2026年大口径管廊支吊架工厂推荐,承重稳固适配大型工程 - 品牌鉴赏师
  • Nanbeige4.1-3B效果展示:实测写诗、编程、答疑,小模型也有大智慧
  • 【工程视角】为什么计算机可能是中国与世界顶尖水平差距最小的行业?
  • 2026年驻马店全铝蜂窝板实力厂家盘点与选择指南 - 2026年企业推荐榜
  • 海景美女图FLUX.1效果展示:同一人物在不同海滩环境中的风格化呈现
  • 春联生成模型-中文-base生产环境部署:Nginx反向代理与7860端口暴露
  • 2026年医用门厂家最新推荐:医用洁净门/医用钢质门/学校树脂门/手术室医用门/树脂病房门/医院平移门/医院洁净门/选择指南 - 优质品牌商家
  • 2026年初河南地区五家吸水石假山盆景厂家浅析 - 2026年企业推荐榜
  • 2026开年聚焦:合肥泥土固化剂可靠源头厂家深度评测 - 2026年企业推荐榜
  • 2026年农作物种子丸粒化机供应商推荐,企业综合实力对比 - 品牌鉴赏师
  • 2026年医院用门公司权威推荐:医用洁净门、医用钢质门、医院洁净门、医院电动门、学校树脂门、手术室医用门、木质医疗门选择指南 - 优质品牌商家
  • 2026年树脂门公司权威推荐:钢制医用门、钢制医疗门、钢制医院用门、钢制病房门、钢质医院专用门、养老院专用门、医用木质门选择指南 - 优质品牌商家
  • 2026年电动门厂家最新推荐:医用木质门、医用树脂门、医用洁净门、医用电动门、医用钢质门、医疗专用门、医院平移门选择指南 - 优质品牌商家
  • AI用一句话,完成微信支付服务商进件接口开发工作,效率太高了(附提示词)
  • 2026年2月Q355B无缝钢管制造厂家最新推荐,定制与全案交付能力 - 品牌鉴赏师
  • 2026年Q1河南高性价比模块实力厂商综合评估报告 - 2026年企业推荐榜
  • 全员开卷!DeepSeek V4 定档下周?阿里开源偷家 OpenClaw,Nano Banana 2 登顶!| AI Weekly 2.23-3.1
  • 2026年大庆眼综合美容机构推荐,一站式美眼方案更省心 - 品牌鉴赏师
  • 2026年2月湖北宜昌徐香猕猴桃直销厂家口碑排行榜 - 2026年企业推荐榜
  • 2026年评价高的医院木质门公司推荐:学校树脂门/手术室医用门/木质医疗门/树脂病房门/钢制医用门/钢制医疗门/选择指南 - 优质品牌商家
  • Qwen3-4B-Thinking-GPT-5-Codex-Distill效果展示:技术博客自动撰写案例
  • 2026年可程式恒温恒湿箱工厂推荐,实力品牌解析采购无忧 - 品牌鉴赏师
  • 一键体验StructBERT:中文情感分类在线演示与案例分享
  • 2026年拉力机定做厂家推荐,企业综合实力与核心竞争力 - 品牌鉴赏师
  • 2026年多行距可调节气吸精播机供货厂家推荐,精准检测性能解析 - 品牌鉴赏师
  • 2026年徐州少儿舞蹈培训选型指南:专业编排是关键 - 2026年企业推荐榜
  • 2026年封口机订购指南:五大专业厂商实力解析 - 2026年企业推荐榜
  • 2026年钢质门厂家权威推荐榜:学校专用门、学校树脂门、手术室医用门、木质医疗门、树脂病房门、钢制医用门、钢制医疗门选择指南 - 优质品牌商家
  • 2026年贵州钢结构大棚厂商最新推荐,养殖种植大棚钢构优选 - 品牌鉴赏师