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

C++11+ 原子操作 `std::atomic`,现代并发编程的核心

之前我研究了机器人开发中的 ROS2(Jazzy)系统相关内容。并将官网中比较重要的教程和概念,按照自己的学习顺序翻译成了中文,并进行了整理和记录。到目前为止,已经整理了20多篇文章。如果你想回顾之前的内容,可以查阅主页中 ROS2(Jazzy)相关文章。

在研究 ROS2 的过程中,我发现它使用了不少 C++11 的新特性。这让我意识到,深入掌握这些特性对于深入理解 ROS2 的实现原理和优化代码非常重要。

因此,我萌生了撰写 C++11 系列文章的想法。目前已经完成了以下几篇文章:

  1. C++11 ROS2性能狂飙:C++11移动语义‘偷梁换柱’实战
  2. C++11 Lambda 表达式 以及 std::functionstd::bind
  3. C++11 智能指针:std::unique_ptrstd::shared_ptrstd::weak_ptr
  4. C++11 的线程管理(std::thread

本文是第五篇,主要总结的是 C++11 原子操作 std::atomic。

C++11 引入了 std::atomic 模板类,它提供了无锁线程安全操作的能力,允许在多线程环境中安全地访问和修改共享数据,而无需显式使用互斥锁。它是现代并发编程的核心组件。

一、原子操作的核心概念与原理

1. 为什么需要原子操作?

加入原子操作主要是为了解决以下问题和需求:

  • 数据竞争问题:多线程同时读写同一个变量导致的未定义行为
  • 锁的开销问题:互斥锁可能导致上下文切换、死锁、优先级反转等问题
  • 性能需求:原子操作利用硬件指令实现高效的无锁同步

2. 原子操作的本质

  • 不可分割性:操作要么完全执行,要么完全不执行
  • 内存可见性:确保修改对所有线程立即可见
  • 顺序约束:通过内存序控制指令重排序,这点在后面详细介绍。

二、基本用法与类型支持

1. 支持的类型

std::atomic 支持所有基本类型:

std::atomic<int> atomicInt(0);       // 原子整型
std::atomic<bool> atomicFlag(false); // 原子布尔
std::atomic<double> atomicDouble;    // 原子浮点(有限操作)

2. 常用的原子操作接口

// 存储值
atomicInt.store(42);// 读取值
int value = atomicInt.load();// 交换值
int old = atomicInt.exchange(100);// 比较交换(CAS)
bool success = atomicInt.compare_exchange_weak(expected, desired);

3. 在算术运算(整数类型)中使用原子操作

std::atomic<int> counter(0);counter.fetch_add(1);    // 原子加(返回旧值)
counter.fetch_sub(1);    // 原子减
counter++;               // 等价于 fetch_add(1) + 1
++counter
http://www.dtcms.com/a/295226.html

相关文章:

  • Delegate、Action 与 Func 委托的全面解析
  • GitHub Actions打包容器,推送 AWS ECR 并使 EKS 自动拉取以完成发版部署
  • 【Java基础06】ArrayList
  • 软考 系统架构设计师系列知识点之杂项集萃(115)
  • Python 程序设计讲义(14):Python 的数据运算——数值运算
  • RabbitMQ--消息顺序性
  • Java集合去重
  • OpenMed 项目深度分析:推动医疗 NLP 领域的开源革命
  • pcie常用的查看寄存器方法
  • node.js中的path模块
  • 低速信号设计之 QSPI 篇
  • 【LeetCode数据结构】二叉树的应用(一)——单值二叉树问题、相同的树问题、对称二叉树问题、另一棵树的子树问题详解
  • Faiss中L2欧式距离与余弦相似度:究竟该如何选择?
  • Web前端入门:JavaScript 哪些地方需要 try...catch 异常捕获
  • 【图论】倍增与lca
  • Avalonia 基于MVVM的时间统计/系统时间显示 示例
  • EPSON爱普生全系列废墨垫已满清零工具分享附教程下载
  • EasyExcel 模板导出数据 + 自定义策略(合并单元格)
  • 基于深度学习的胸部 X 光图像肺炎分类系统(三)
  • Turbo Intruder 并发插件无法试用--更换新版Burpsuit解决(简单解决安装、破解问题)
  • 开源Qwen凌晨暴击闭源Claude!刷新AI编程SOTA,支持1M上下文
  • 跨境支付入门~国际支付结算(结算篇)
  • AtCoder Beginner Contest 415(ABCDE)
  • `neutron router-gateway-set` 操作失败的可能原因及解决方案
  • 深度分析Java多线程机制
  • 【智能协同云图库】智能协同云图库第六弹:空间模块开发
  • 微服务的编程测评系统6-管理员登录前端-前端路由优化
  • 【开源】WPF的数据可视化大屏解决方案——WpfMap
  • 洛谷 P11378 [GESP202412 七级] 燃烧-普及/提高-
  • fdbus4.2 timer的使用