634 字
3 分钟
原子操作是什么?原子性、可见性和有序性有什么区别
原子操作对其他执行流表现为不可分割的单次操作。例如原子加法避免两个线程在普通 count++ 的读、改、写之间互相覆盖。CPU 通常用专门指令或缓存一致性协议实现,编程语言再通过原子类型定义可移植语义。
面试中要区分三个概念:原子性表示操作不可被观察为部分完成;可见性表示一个线程的写入何时能被其他线程观察;有序性表示编译器和 CPU 能否重排内存操作。一个普通变量即使单次读写在硬件上不撕裂,也不代表复合操作原子,也不保证跨线程可见性与顺序。
原子变量可以实现计数器、标志位或无锁算法的一部分,但不能自然保护多个字段组成的不变量。例如账户余额和交易总额必须一起更新时,单个原子字段不足以提供整体事务性。复杂无锁结构还需要处理 ABA、内存回收和正确的内存序,通常比使用锁更难验证。
编程语言提供的原子 API 有不同内存序:最宽松的原子性不一定建立线程间先后关系;当 acquire 操作观察到 release 操作发布的值时,release/acquire 配对可建立发布与读取关系;顺序一致性更易理解但可能有额外成本。不能只凭“用了原子类型”断言数据竞争已经消失,所有相关访问都必须遵循同一同步协议。
常见追问
Q:原子加法可以替代互斥锁吗?
A:只有当需要维护的状态确实能由该原子操作独立表达时才行;多个变量的复合不变量、条件等待和复杂临界区通常仍需锁或更高级同步。
Q:CPU 有原子指令,为什么还要语言内存模型?
A:编译器可能重排或缓存读写,且不同架构的内存顺序不同。语言内存模型规定程序员可依赖的语义,并约束编译器如何生成机器指令。
Q:原子操作一定比锁快吗?
A:不一定。高竞争下缓存行会在核心间来回迁移,复杂 CAS 循环可能反复失败;短临界区的锁也可能非常高效。应按正确性和实际负载选择。
原子操作是什么?原子性、可见性和有序性有什么区别
https://blog.xqcherry.top/posts/interview/operating-system/atomic-operations/ 目录