原子类型是对编译器和硬件访问内存的限制,保证在同一时间内对原子类型内存的操作只有一个。除此之外,可以指定原子类型的访问顺序,以限制编译器和硬件修改对内存的访问顺序(对于单线程是一种优化,对于多线程可能导致数据竞争)。
这里,只对原子访问的顺序做一个归纳:
- Relaxed,允许编译器和硬件修改指令顺序。
- Release,阻止编译器和硬件将之前的指令重排到原子类型之后,在原子类型之前形成内存屏障,在原子类型之后释放内存屏障,用于写。
- Acquire,阻止编译器和硬件将之后的指令重排到原子类型之前,在原子类型之后形成内存屏障,用于读。
- AcqRel,写时 Release 语义,读时 Acquire 语义,用于读写。
- SeqCst,保证指令顺序与代码顺序一致,不知道怎么做时,用这个来保证程序的准确性。
感兴趣的朋友可以继续查看下面的资料: