C++11的atomic原子变量是否基于volatile和CAS实现?
C++11
std::atomic 实现原理说明 核心结论先行:C++11 标准中的std::atomic并未采用 volatile 搭配 CAS 的实现方案,其实现逻辑和 Java 的AtomicInteger有本质区别,具体如下:
实现机制
std::atomic的具体实现由编译器结合目标硬件平台决定,C++标准仅约束其原子性、内存序等对外语义,常见实现逻辑分为两类:
- 对长度符合平台原生原子访问要求的基础类型(比如x86平台下32位/64位整型),编译器会直接生成单周期原子读写指令,无需额外的CAS操作,就能保证变量访问的原子性。
- 对无法通过单指令完成的原子操作(比如比较交换、原子增减),或是超过平台原生原子访问长度的自定义类型原子变量,分两种实现:
- 大部分场景调用底层硬件提供的原子原语实现:比如x86架构下带
lock前缀的cmpxchg指令、ARM架构下的LDXR/STXR独占访问指令对,来完成CAS逻辑; - 对部分超大尺寸的自定义类型,也可能采用内部加锁的方式实现原子性,不使用CAS。
- 大部分场景调用底层硬件提供的原子原语实现:比如x86架构下带
为什么不用volatile实现?
C++中的volatile和原子操作的语义完全无关,根本无法满足std::atomic的要求:
C++标准规定volatile仅用于禁止编译器对变量访问做优化,要求每次读写都直接操作内存,既不保证操作的原子性,也不提供多线程并发场景下的内存屏障语义。
和Java中内置了内存屏障语义的volatile不同,C++的volatile设计初衷是用来处理内存映射IO、寄存器访问这类嵌入式场景,和多线程并发没有关系,因此std::atomic的实现完全不会用到volatile关键字。
内容的提问来源于stack exchange,提问作者expoter
相关产品推荐
相关产品推荐

