news 2026/4/18 8:34:38

原子操作(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/4/16 18:19:59

ESP32开发环境搭建:Arduino IDE手把手教程

从零开始玩转ESP32&#xff1a;手把手教你用Arduino IDE点亮第一盏灯 你是不是也曾在物联网项目中看到别人轻松实现Wi-Fi控制、蓝牙通信&#xff0c;而自己却卡在“环境怎么都配不好”这一步&#xff1f;别急&#xff0c;今天我们就来彻底解决这个让人头疼的入门难题。 我们不…

作者头像 李华
网站建设 2026/4/18 2:00:01

Windows上的AirPods智能管家:让千元耳机物超所值

还在为Windows电脑上使用AirPods的各种不便而烦恼吗&#xff1f;AirPodsDesktop这款开源工具&#xff0c;就像给你的AirPods配了一位贴心的智能管家&#xff0c;让你的使用体验焕然一新。 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement pr…

作者头像 李华
网站建设 2026/4/17 16:39:47

WorkshopDL终极指南:解锁Steam创意工坊模组下载新体验

WorkshopDL终极指南&#xff1a;解锁Steam创意工坊模组下载新体验 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否曾经遇到过这样的困境&#xff1a;在其他平台购买了心仪…

作者头像 李华
网站建设 2026/4/16 12:36:47

buuctf中的jarvisoj_fm

首先checksec检查保护机制&#xff1a;-32位程序-开启了栈溢出保护和栈不可执行保护接下来使用反汇编工具IDA进行分析&#xff1a;发现没有后门函数&#xff0c;不过有printf函数&#xff0c;可触发格式化字符串漏洞&#xff0c;再看下面&#xff0c;只要让x的值等于4&#xff…

作者头像 李华
网站建设 2026/4/17 10:56:16

手把手教你认识逻辑门:从与或非开始

从零开始搞懂逻辑门&#xff1a;与、或、非的硬核实战解析你有没有想过&#xff0c;手机里每一条消息、电脑中每一次点击&#xff0c;背后其实都是一群“0”和“1”在疯狂打架&#xff1f;而这场战斗的最小作战单位&#xff0c;就是——逻辑门。别被这个名字吓到。它听起来高深…

作者头像 李华
网站建设 2026/4/16 14:09:37

红外遥控解码:基于Arduino Uno的入门级实验

从遥控器到代码&#xff1a;用Arduino解码红外信号的完整实践 你有没有想过&#xff0c;当你按下电视遥控器的“电源”键时&#xff0c;那一道看不见的红外光是如何被识别并执行命令的&#xff1f;这看似简单的操作背后&#xff0c;其实是一套精密设计的通信协议在默默工作。今…

作者头像 李华