0

0

C++ 原子操作(Atomic Operations)是什么?(如何实现无锁编程)

尼克

尼克

发布时间:2026-02-11 14:12:09

|

683人浏览过

|

来源于php中文网

原创

std::atomic仅保证单变量读写原子性,非万能锁;需配合memory_order解决内存序问题,避免重排导致数据未初始化;慎用伪失败的compare_exchange_weak,false sharing需对齐隔离。

c++ 原子操作(atomic operations)是什么?(如何实现无锁编程)

std::atomic 不是线程安全的万能锁

它只是对单个变量的读写提供原子性保证,不是自动保护整个逻辑块。比如两个 std::atomic 变量之间的操作(如先读 A 再根据 A 更新 B)依然可能被其他线程打断,这不是 std::atomic 能解决的。

常见错误现象:data_readystd::atomic,但生产者写完数据后才设为 true,消费者却没加内存序约束,导致看到 true 却读到未初始化的数据 —— 这是编译器重排或 CPU 乱序导致的,不是原子性失效,而是内存序缺失。

  • 必须配合内存序(memory_order)使用,最常用的是 memory_order_acquire(读)和 memory_order_release(写)
  • memory_order_relaxed 仅保证原子性,不约束前后指令顺序,适合计数器等无依赖场景
  • 不要用 std::atomic 模拟自旋锁:它不提供等待语义,应改用 std::atomic_flag + test_and_set()

std::atomic_flag 是唯一保证无锁(lock-free)的原子类型

C++ 标准只要求 std::atomic_flag 必须是 lock-free 的,其它 std::atomic 类型是否 lock-free 取决于平台和大小。比如在 x86-64 上 std::atomic 通常是 lock-free,但在某些嵌入式平台可能退化为内部加锁实现。

使用场景:实现自旋锁、轻量级信号量、无锁队列的 head/tail 指针更新。

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

  • 检查是否 lock-free:flag.is_lock_free()ATOMIC_FLAG_INIT 初始化后调用 is_lock_free()
  • 必须用 ATOMIC_FLAG_INIT 初始化,不能用 = {} 或默认构造
  • test_and_set() 默认是 memory_order_seq_cst,如需性能可显式传入 memory_order_acquire

compare_exchange_weak 和 compare_exchange_strong 的区别不是“弱”和“强”,而是“允许伪失败”

compare_exchange_weak 在某些平台(尤其是 LL/SC 架构如 ARM、RISC-V)可能因外部干扰(如中断、缓存同步)返回 false,即使当前值等于期望值。这不是 bug,是硬件特性。

Flowith
Flowith

一款GPT4驱动的节点式 AI 创作工具

下载

错误做法:把 compare_exchange_weak 当成一次性的条件更新,不重试就继续往下走。

  • 几乎所有循环 CAS 场景都该用 compare_exchange_weak,因为伪失败成本低,且循环本身已处理重试逻辑
  • compare_exchange_strong 保证“值相等就一定成功”,但可能更慢(x86 上两者汇编相同,ARM 上 strong 可能多几条指令)
  • 非循环场景(如只试一次)才考虑 strong,但要意识到它仍可能失败(比如值本来就不等)

无锁编程 ≠ 没有同步开销,反而更容易写出正确但低效的代码

原子操作本身比普通读写贵得多:x86 上 mov 是 1 cycle,lock xadd 是 20–100+ cycles;更麻烦的是 cache line bouncing —— 多个线程频繁修改同一 cache line 中的不同原子变量,会反复使彼此的 cache line 无效。

典型坑:std::atomic a, b, c; 放在一起,三个变量落在同一个 64 字节 cache line 内,A 线程改 a,B 线程改 b,也会互相拖慢。

  • alignas(64) 对齐每个原子变量,或插入 char padding[64] 避免 false sharing
  • 别为了“无锁”而无锁:如果临界区短、竞争低,std::mutex 实际更快,也更易维护
  • 调试困难:竞态不会稳定复现,TSAN 可检测部分问题,但无法覆盖所有内存序误用

真正难的从来不是怎么写原子操作,是怎么画清楚变量间的依赖关系、确定哪些顺序必须保留、哪些可以放松 —— 这些没法靠查文档解决,得靠对硬件模型和具体场景的双重理解。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
线程和进程的区别
线程和进程的区别

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

633

2023.08.10

css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

138

2023.12.07

Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析
Yandex网页版官方入口使用指南_国际版与俄罗斯版访问方法解析

本专题全面整理了Yandex搜索引擎的官方入口信息,涵盖国际版与俄罗斯版官网访问方式、网页版直达入口及免登录使用说明,帮助用户快速、安全地进入Yandex官网,高效使用其搜索与相关服务。

1

2026.02.11

虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法
虫虫漫画网页版入口与免费阅读指南_正版漫画全集在线查看方法

本专题系统整理了虫虫漫画官网及网页版最新入口,涵盖免登录观看、正版漫画全集在线阅读方式,并汇总稳定可用的访问渠道,帮助用户快速找到虫虫漫画官方页面,轻松在线阅读各类热门漫画内容。

1

2026.02.11

Docker容器化部署与DevOps实践
Docker容器化部署与DevOps实践

本专题面向后端与运维开发者,系统讲解 Docker 容器化技术在实际项目中的应用。内容涵盖 Docker 镜像构建、容器运行机制、Docker Compose 多服务编排,以及在 DevOps 流程中的持续集成与持续部署实践。通过真实场景演示,帮助开发者实现应用的快速部署、环境一致性与运维自动化。

1

2026.02.11

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

1

2026.02.11

Spring Boot企业级开发与MyBatis Plus实战
Spring Boot企业级开发与MyBatis Plus实战

本专题面向 Java 后端开发者,系统讲解如何基于 Spring Boot 与 MyBatis Plus 构建高效、规范的企业级应用。内容涵盖项目架构设计、数据访问层封装、通用 CRUD 实现、分页与条件查询、代码生成器以及常见性能优化方案。通过完整实战案例,帮助开发者提升后端开发效率,减少重复代码,快速交付稳定可维护的业务系统。

3

2026.02.11

包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法
包子漫画网页版入口与全集阅读指南_正版免费漫画快速访问方法

本专题汇总了包子漫画官网和网页版入口,提供最新章节抢先看方法、正版免费阅读指南,以及稳定访问方式,帮助用户快速直达包子漫画页面,无广告畅享全集漫画内容。

137

2026.02.10

MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法
MC.JS网页版快速畅玩指南_MC.JS官网在线入口及免安装体验方法

本专题汇总了MC.JS官网入口和网页版快速畅玩方法,提供免安装访问、不同版本(1.8.8、1.12.8)在线体验指南,以及正版网页端操作说明,帮助玩家轻松进入MC.JS世界,实现即时畅玩与高效体验。

80

2026.02.10

热门下载

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

精品课程

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

共94课时 | 9.1万人学习

C 教程
C 教程

共75课时 | 4.6万人学习

C++教程
C++教程

共115课时 | 17.1万人学习

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

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