news 2026/5/10 14:39:17

原子操作(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/5/10 19:28:42

如何高效突破平台限制:WorkshopDL开源下载工具的完整指南

如何高效突破平台限制&#xff1a;WorkshopDL开源下载工具的完整指南 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 作为一名《盖瑞的模组》的忠实玩家&#xff0c;小张最近遇…

作者头像 李华
网站建设 2026/5/11 2:20:28

告别命令行:Applite如何让Mac软件管理变得如此简单

告别命令行&#xff1a;Applite如何让Mac软件管理变得如此简单 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 你是否曾经为安装一个Mac应用而不得不打开终端&#xff0c;输入…

作者头像 李华
网站建设 2026/5/10 8:00:26

PHP开发指南 P8:模块化、会话管理、密码安全与OOP入门

PHP开发指南 P8&#xff1a;模块化、会话管理、密码安全与OOP入门 作为PHP开发者&#xff0c;从基础语法过渡到工程化、安全化的编码思维&#xff0c;是进阶的关键一步。本文将围绕「代码复用」「用户状态保持」「密码安全」「面向对象编程」四个核心知识点展开&#xff0c;结…

作者头像 李华
网站建设 2026/5/11 2:21:07

告别网盘限速困扰,这款工具让你下载飞起来

告别网盘限速困扰&#xff0c;这款工具让你下载飞起来 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无需…

作者头像 李华
网站建设 2026/5/9 19:48:14

如何快速使用京东自动评价工具:新手用户的完整指南

京东自动评价工具是一款专为简化购物评价流程而设计的智能助手。这个基于Python开发的开源项目能够帮助用户自动生成贴合商品特点的个性化评价内容&#xff0c;让评价工作变得轻松高效。无论您是想要节省时间的普通消费者&#xff0c;还是需要管理多个账号的用户&#xff0c;这…

作者头像 李华
网站建设 2026/5/9 17:04:50

Revelation光影包深度解析:5大核心机制重塑Minecraft视觉体验

Revelation光影包深度解析&#xff1a;5大核心机制重塑Minecraft视觉体验 【免费下载链接】Revelation A realistic shaderpack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/re/Revelation 当像素方块遇上真实光影&#xff0c;Minecraft的世…

作者头像 李华