陕西省网站建设_网站建设公司_VS Code_seo优化
2025/12/22 20:55:22 网站建设 项目流程

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

总结一句话:

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

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询