原子 = 不可分割,一段操作一旦开始,要么全部执行完,要么完全不执行,中间不会被线程切换打断。
拆解为三步:读 i → 计算 + 1 → 写回 i多线程并发时,线程切换插在中间就会出现数据竞争、丢失更新。原子变量把「读 - 改 - 写」打包成一条 CPU 硬件指令,操作系统 / CPU 不会中途切线程,天然线程安全,不需要互斥锁 mutex。Linux 内核atomic_t:
#include<asm/atomic.h>atomic_t cnt = ATOMIC_INIT(0);atomic_inc(&cnt); // 原子+1atomic_dec(&cnt); // 原子-1
典型使用场景
多线程计数器:连接数、请求量、统计指标;
状态标记:开关、是否初始化、停止信号;
无锁队列、无锁数据结构(依赖 CAS);
自旋锁底层实现。
局限(重要)
只能做简单算术 / 交换,不能保护一段复杂逻辑;复杂临界区必须用锁;
不支持自定义结构体复杂运算,仅基础整型、指针;
CAS 存在 ABA 问题,无锁编程需要额外方案(版本号、 hazard pointer)。