news 2026/6/15 13:52:45

原子操作(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/6/14 18:43:22

终极跨平台模组下载指南:WorkshopDL让Steam创意工坊资源触手可及

终极跨平台模组下载指南&#xff1a;WorkshopDL让Steam创意工坊资源触手可及 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为Epic、GOG等平台购买的游戏无法使用Steam创意…

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

网盘直链解析神器:5分钟解锁高速下载新体验

网盘直链解析神器&#xff1a;5分钟解锁高速下载新体验 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改&#xff08;改自6.1.4版本&#xff09; &#xff0c;自用&#xff0c;去推广&#xff0c;无需…

作者头像 李华
网站建设 2026/6/15 17:12:30

VRM Blender插件完全配置手册:从安装到高级应用的全流程解析

VRM Blender插件完全配置手册&#xff1a;从安装到高级应用的全流程解析 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 当你在Blender中…

作者头像 李华
网站建设 2026/6/15 14:12:51

ComfyUI背景移除革命:BiRefNet插件深度解析与实战指南

ComfyUI背景移除革命&#xff1a;BiRefNet插件深度解析与实战指南 【免费下载链接】ComfyUI-BiRefNet-ZHO Better version for BiRefNet in ComfyUI | Both img & video 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-BiRefNet-ZHO 还在为抠图烦恼吗&#x…

作者头像 李华
网站建设 2026/6/15 13:47:57

5个实用技巧:彻底解决VRM模型转换中的骨骼丢失问题

5个实用技巧&#xff1a;彻底解决VRM模型转换中的骨骼丢失问题 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 or later 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 在VRM-Addon-for-Blender…

作者头像 李华
网站建设 2026/6/15 8:59:26

基于SpringBoot + Vue的网上购物系统

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…

作者头像 李华