news 2026/7/15 16:52:06

原子操作(Atomic Operations)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
原子操作(Atomic Operations)

原子操作(Atomic Operations)是并发编程和系统底层开发中的核心概念,指不可被中断的、要么全部执行成功、要么完全不执行的操作。在多线程或多处理器环境中,原子操作确保对共享数据的访问是线程安全的,无需额外加锁。


一、核心特性

特性说明
不可分割性操作在执行过程中不会被其他线程或 CPU 中断。
内存可见性操作结果对所有处理器/线程立即可见(通常配合内存屏障)。
顺序一致性(可选)可通过内存序(memory order)控制操作的重排序行为。

二、常见原子操作原语

原语功能典型用途
load原子读取变量值安全读取共享状态
store原子写入新值安全更新标志位等
exchange/swap原子交换旧值与新值,并返回旧值实现自旋锁(如test_and_set
compare_and_swap(CAS)若当前值等于期望值,则更新为新值无锁数据结构、乐观并发控制
fetch_and_add原子加法并返回加之前的值计数器、Ticket 自旋锁
fetch_and_sub/fetch_and_and/fetch_and_or原子复合操作位标志管理、引用计数等

注:这些操作通常作用于整型或指针类型,且要求自然对齐(如 4 字节对齐的 int)。


三、硬件支持

不同架构提供不同的原子指令:

  • x86/x86-64
    • LOCK前缀指令(如lock xadd,lock cmpxchg
    • xchg指令天然原子
  • ARM
    • LDREX/STREX(Load-Exclusive / Store-Exclusive)
  • RISC-V
    • amo*指令(如amoswap,amoaddd

操作系统和编译器将这些指令封装为高级语言可用的接口。


四、编程语言支持

C11 / C++11(标准方式)

编辑

#include <stdatomic.h> atomic_int counter = ATOMIC_VAR_INIT(0); atomic_fetch_add(&counter, 1); // 原子加 1

编辑

#include <atomic> std::atomic<int> flag{0}; flag.store(1, std::memory_order_release);

GCC / Clang 内建函数(兼容旧标准)

编辑

// 已弃用但广泛使用 __sync_fetch_and_add(&var, 1); __sync_bool_compare_and_swap(&var, old, new); // 推荐:__atomic 系列(C11 风格) __atomic_load_n(&var, __ATOMIC_ACQUIRE); __atomic_compare_exchange_n(&var, &expected, desired, false, __ATOMIC_ACQ_REL, __ATOMIC_RELAXED);

Rust

编辑

use std::sync::atomic::{AtomicUsize, Ordering}; static COUNTER: AtomicUsize = AtomicUsize::new(0); COUNTER.fetch_add(1, Ordering::SeqCst);

五、内存顺序(Memory Ordering)

原子操作可指定内存序,平衡性能与正确性:

内存序说明
memory_order_relaxed仅保证原子性,无同步或顺序约束(最快)
memory_order_acquire读操作后,禁止后续读写重排到之前(用于“获取”锁)
memory_order_release写操作前,禁止前面读写重排到之后(用于“释放”锁)
memory_order_acq_rel同时具备 acquire 和 release 语义(如 CAS 成功时)
memory_order_seq_cst全局顺序一致(默认,最安全但最慢)

示例:自旋锁通常使用acquire(加锁)和release(解锁)语义。


六、典型应用场景

  1. 无锁(Lock-Free)数据结构
    如队列、栈、哈希表,使用 CAS 实现线程安全。

  2. 引用计数
    shared_ptr的引用计数使用fetch_add/fetch_sub

  3. 标志位与状态机
    shutdown_flag,用store/load安全通信。

  4. 自旋锁与轻量级同步
    基于exchangetest_and_set实现。

  5. 性能计数器
    多线程统计命中次数等。


七、注意事项

  • 不是所有操作都是原子的:普通i++不是原子操作!
  • 对齐很重要:未对齐的原子操作可能退化为非原子或引发异常。
  • ⚠️避免过度使用:原子操作仍有开销(缓存行锁定、总线事务)。
  • 🔒不能替代所有锁:复杂临界区仍需互斥锁。

总结一句话:

原子操作是构建高效、正确并发程序的基石,它以硬件支持的不可分割性,实现无锁或轻量级的线程同步。

掌握其原理、原语和内存模型,是编写高性能并发代码的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 21:43:40

OpenCore Legacy Patcher实战教程:让旧Mac焕发新生

还在为苹果官方放弃支持的旧款Mac设备而烦恼吗&#xff1f;OpenCore Legacy Patcher这款开源神器&#xff0c;能够完美解决您的困扰&#xff0c;让2017年之前的Intel Mac设备重新获得最新macOS系统的支持。 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项…

作者头像 李华
网站建设 2026/7/14 6:43:38

中国行政区划数据实战手册:从零开始构建你的GIS项目

还在为找不到准确的中国行政区划数据而烦恼吗&#xff1f;这个项目为你提供了一套完整的四级行政区划Shapefile数据&#xff0c;从国家到区县一应俱全&#xff0c;让你轻松开启地理信息系统之旅&#xff01; 【免费下载链接】ChinaAdminDivisonSHP 项目地址: https://gitcod…

作者头像 李华
网站建设 2026/7/12 16:18:15

Comics Downloader:终极漫画批量下载神器完整指南

Comics Downloader&#xff1a;终极漫画批量下载神器完整指南 【免费下载链接】comics-downloader tool to download comics and manga in pdf/epub/cbr/cbz from a website 项目地址: https://gitcode.com/gh_mirrors/co/comics-downloader 还在为寻找心仪漫画资源而烦…

作者头像 李华
网站建设 2026/7/15 8:30:49

高校官宣!发一篇EI位同3区,这几本EI源刊最快一周审稿,沾边就录

部分学校目前已明确规定&#xff1a;发一篇EI期刊论文视同为SCI三区&#xff01;本期&#xff0c;小编给大家介绍几本目前进展较顺的EI期刊合集&#xff0c;适合时间紧张的学者&#xff0c;供各位投稿参考&#xff01; EI源刊——最快1周录用 【期刊概况】位于最新EI目录内 …

作者头像 李华