C++ 无锁编程:原子操作、内存顺序与生产者-消费者模型的实战指南
目录1六大内存序2原子操作2.1原子操作的核心操作基础操作store 和 load3利用内存模型和原子操作的生产者消费者模型设计1六大内存序内存顺序类型核心特点memory_order_relaxed宽松无同步只保证原子性不保证顺序。不引入同步屏障允许编译器和 CPU 任意重排memory_order_consume消费已过时依赖当前原子变量的后续操作不被重排到它之前。不推荐使用编译器通常降级为 acquirememory_order_acquire获取读屏障该原子读操作之后的所有读写操作都不能重排到该操作之前。memory_order_release释放写屏障该原子写操作之前的所有读写操作都不能重排到该操作之后memory_order_acq_rel获取-释放读写屏障同时具备 acquire 和 release 效果用于 Read-Modify-Write 操作如 exchange。memory_order_seq_cst顺序一致性最强全局所有线程看到统一的修改顺序最强最直观但性能开销最大。1memory_order_release 释放----写屏障 可以理解为原子操作的时候进行写操作在写完释放给别的线程读之前必须把此线程在自身缓冲区写的数据全部同步到 公共的缓存中“线程在执行 Release 写操作时必须确保本线程在 Release 之前发生的所有写操作都已经对其它核心可见即排空到共享缓存然后才允许执行 Release 这个写操作本身。”2memory_order_acquire 获取----读屏障 可以理解为必须先将公共区的数据都读完之后在进行其他的操作比如写操作。2原子操作原子操作Atomic Operation是指不可被中断的一个或一系列操作。在多线程环境中原子操作要么全部执行完成要么完全不执行不会出现执行到一半被其他线程干扰的情况。2.1原子操作的核心操作基础操作store 和 load操作函数原型允许的内存顺序写入void store(T desired, memory_order order seq_cst)relaxed, release, seq_cst读取T load(memory_order order seq_cst) constrelaxed, acquire, seq_cststd::atomicintvalue{0};// store 操作value.store(42);// 默认 seq_cstvalue.store(100,std::memory_order_release);// 显式指定 releasevalue.store(1,std::memory_order_relaxed);// 最弱的顺序// load 操作int xvalue.load();// 默认 seq_cstint yvalue.load(std::memory_order_acquire);// 显式指定 acquireint zvalue.load(std::memory_order_relaxed);// 最弱的顺序store 不能使用 memory_order_acquire 或 memory_order_acq_relload 不能使用 memory_order_release 或 memory_order_acq_rel操作函数原型说明交换T exchange(T desired, memory_order order seq_cst)用新值替换旧值返回旧值CAS弱bool compare_exchange_weak(T expected, T desired, …)可能虚假失败适合循环CAS强bool compare_exchange_strong(T expected, T desired, …)不会虚假失败算术T fetch_add(T arg, memory_order order seq_cst)加、减、与、或、异或std::atomicintcounter{10};// exchange交换并返回旧值int oldcounter.exchange(20);// old 10, counter 20// fetch_add原子加int previouscounter.fetch_add(5);// previous 20, counter 25// compare_exchangeCASCompare-And-Swapint expected25;if(counter.compare_exchange_strong(expected,100)){// 如果 counter 当前是 25替换为 100expected 不变std::cout替换成功counter 100std::endl;}else{// 替换失败expected 被更新为 counter 的实际值std::cout替换失败当前值为expectedstd::endl;}特性compare_exchange_weakcompare_exchange_strong虚假失败✅ 可能即使相等也返回 false❌ 不会相等一定返回 true性能更快某些平台可用 LL/SC 优化稍慢需要重试处理典型用法循环中while weak单次检查返回值bool成功/失败bool成功/失败// ✅ weak 的正确用法在循环中重试std::atomicintvalue{0};int expected0;while(!value.compare_exchange_weak(expected,100,std::memory_order_acq_rel)){// 失败时 expected 被更新为实际值// 这里可以加一个最大重试次数限制}// ✅ strong 的典型用法单次检查int expected0;if(value.compare_exchange_strong(expected,100,std::memory_order_acq_rel)){// 成功处理}3利用内存模型和原子操作的生产者消费者模型设计#includeiostream#includethread#includeatomicstd::atomicintcount{0};// 共享整形变量初始为 0绝对主角std::atomicboolready{false};// 同步标志true有货待消费false已消费// 生产者count 不断加一 voidproducer(){for(int i1;i10;i){// ① 直接修改 count加一操作// 使用 release保证这次写入完成之前之前的所有操作都已完成count.store(i,std::memory_order_release);// ② 通知消费者count 已经更新快来打印// 必须用 release保证 count 的写入在通知之前可见ready.store(true,std::memory_order_release);// ③ 等待消费者打印完成等待 ready 被改回 falsewhile(ready.load(std::memory_order_acquire)){// 自旋等待CPU 会忙等}}}// 消费者打印 count 的当前值 voidconsumer(){for(int i1;i10;i){// ① 等待生产者通知等待 ready 变成 truewhile(!ready.load(std::memory_order_acquire)){// 自旋等待}// ② 读取 count 的最新值并打印// 用 acquire 保证读到的 count 一定是生产者 release 写进去的最新值int valuecount.load(std::memory_order_acquire);std::cout消费者打印: count valuestd::endl;// ③ 告诉生产者我已经打印完了你可以生产下一个了// 用 release 保证“打印完成”这个动作在改 ready 之前完成ready.store(false,std::memory_order_release);}}intmain(){std::threadt1(producer);std::threadt2(consumer);t1.join();t2.join();return0;}

相关新闻

OpenCompass L2评测实践与书生大模型能力验证

OpenCompass L2评测实践与书生大模型能力验证

1. 项目背景与核心价值OpenCompass作为当前大模型评测领域的重要工具链,其L2级别的评测实践对于检验书生大模型的实际能力具有重要意义。这次实践不仅是对模型性能的常规测试,更是对模型在复杂场景下表现的系统性验证。在自然语言处理领域,大…

2026/7/27 5:09:24 阅读更多 →
CNN-LSTM-Attention模型在工业时序数据分类中的应用

CNN-LSTM-Attention模型在工业时序数据分类中的应用

1. 项目概述:当CNN遇上LSTM与Attention在时间序列数据分类预测领域,传统单一模型往往难以同时捕捉空间特征和时间依赖。三年前我在处理一组工业传感器数据时,发现单纯使用CNN虽然能提取局部特征,但对长期时序模式识别效果欠佳&…

2026/7/27 5:09:24 阅读更多 →
Codex 经常执行失败怎么办?从开发环境配置到 ChatGPT Pro 选择

Codex 经常执行失败怎么办?从开发环境配置到 ChatGPT Pro 选择

很多开发者第一次使用 Codex 时,会直接把整个项目交给它处理:“帮我修复这个仓库里的所有错误。”“运行项目并解决启动失败的问题。”“完成这个功能,然后把测试全部跑通。”但实际执行后,经常会出现任务停滞、命令报错、依赖安装…

2026/7/27 5:08:24 阅读更多 →

最新新闻

GPT-OSS:开源可控AI解决方案的技术解析与应用实践

GPT-OSS:开源可控AI解决方案的技术解析与应用实践

1. 可控智能体的产业价值与技术挑战在人工智能技术快速发展的当下,如何实现AI系统的安全可控部署已成为行业核心议题。GPT-OSS作为目前全球唯一的开源可控AI解决方案,为这一难题提供了切实可行的技术路径。不同于传统黑箱模型,可控智能体通过…

2026/7/27 5:17:28 阅读更多 →
AI如何优化学术写作流程与降重技巧

AI如何优化学术写作流程与降重技巧

1. 学术写作的痛点与AI解决方案作为一名经历过本科、硕士到博士论文写作全过程的学术工作者,我深知学术写作中的种种痛点。每当看到学弟学妹们熬夜修改格式、反复降重时,我都会想:如果有个工具能帮我们解决这些机械性工作该多好?百…

2026/7/27 5:17:28 阅读更多 →
DSP/BIOS内核深度解析:函数调用规则、错误诊断与寄存器管理实战

DSP/BIOS内核深度解析:函数调用规则、错误诊断与寄存器管理实战

1. 项目概述与核心价值如果你正在基于TI的TMS320C55x系列DSP进行嵌入式开发,尤其是涉及到复杂的实时任务调度和中断处理,那么DSP/BIOS这个实时内核(RTOS)你一定不陌生。它远不止是一个简单的任务调度器,而是一个为DSP应…

2026/7/27 5:17:28 阅读更多 →
安卓系统证书安装:突破HTTPS抓包限制的Charles根证书部署指南

安卓系统证书安装:突破HTTPS抓包限制的Charles根证书部署指南

1. 项目概述:为什么要把Charles证书装进安卓系统目录?搞移动端开发或者安全测试的朋友,对Charles这个抓包工具肯定不陌生。它就像是我们窥探手机App网络活动的一扇窗,能清晰地看到HTTP/HTTPS请求的每一个细节。但很多新手&#xf…

2026/7/27 5:17:28 阅读更多 →
Windows 11无线网卡驱动安装与优化指南

Windows 11无线网卡驱动安装与优化指南

1. 无线网卡驱动安装的必要性刚拿到新电脑或者重装系统后,最让人抓狂的就是连不上WiFi。很多人第一反应是"网络坏了",但实际上90%的情况是缺少无线网卡驱动。就像买车没有发动机钥匙一样,再好的硬件没有驱动也发挥不了作用。Window…

2026/7/27 5:17:27 阅读更多 →
Blazor数据可视化实战:ComponentOne趋势线应用

Blazor数据可视化实战:ComponentOne趋势线应用

1. 项目概述:当Blazor遇上数据可视化在数据驱动的时代,如何从海量信息中快速识别关键模式成为每个开发者的必修课。最近我在一个金融分析项目中使用了ComponentOne的Blazor Charts组件,其趋势线功能让我眼前一亮。不同于简单的折线图展示&…

2026/7/27 5:16:27 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻