32位x86处理器不能为64位类型提供简单的原子读取操作。在此类处理“普通”寄存器的CPU上,对64位类型唯一的原子操作是
LOCKCMPXCHG8B,这就是为什么在此使用它的原因。另一种选择是使用
MOVQ和MMX /
XMM寄存器,但是这需要了解FPU状态/寄存器,并且需要使用MMX / XMM指令完成对该值的所有操作。
在64位x86_64处理器上,对64位类型的对齐读取是原子的,并且可以通过一条
MOV指令完成,因此仅需要进行普通读取—
的使用
volatile只是为了确保编译器实际进行读取,并且不缓存先前的值。
至于读取顺序,您引用的内联汇编程序可确保编译器以正确的顺序发出指令,这是x86 / x86_64
CPU所需要的,只要写入顺序正确即可。
LOCKed在x86上的写入具有总顺序;普通
MOV写提供了“因果一致性”,因此,如果线程A做到了,
x=1那么
y=2如果线程B进行了读取,
y==2则随后的读取
x将看到
x==1。
在IA-64中,的PowerPC,SPARC,和具有更宽松的存储器模型其它处理器很可能有更多的
atomic64_read()和
barrier()。



