atomic.SwapInt64
汇编
不再浪费时间去找源码了, 因为atomic这部分的实现全部都依赖于底层的汇编指令
会发现一件事情, 那就是这里的实现和Store是几乎一致的, 为什么呢?
原因出在XCHG
XCHG
XCHG
是x86架构汇编语言中的一条指令,它的全称是“Exchange Register/Memory with Register”,即“用寄存器交换寄存器/内存中的内容”。这条指令用于交换两个操作数的值。这两个操作数可以是寄存器或其中一个是内存地址。举例来说,在x86汇编中:
XCHG AX, BX
这条指令将交换
AX
和BX
两个寄存器中的值。或者与内存地址交换:
XCHG AX, [MEM_ADDR]
这将交换
AX
寄存器和内存地址MEM_ADDR
指向的值。
XCHG
指令在多线程编程和同步机制中尤其有用,因为该指令在单个操作中执行读取、写入以及交换操作,能够原子性地进行,避免了多线程中的竞态条件。在现代CPU中,使用XCHG指令通常会隐含地锁定总线,以防止其他处理器或缓存同时访问相同的内存地址,确保操作的原子性。但是这会带来性能的开销,因此在多核处理器上要谨慎使用。在现代编程中,通常不需要直接使用XCHG指令。编程语言和它们的库通常会提供更高层次的抽象来处理多线程同步的问题,例如互斥锁(Mutexes)和条件变量(Condition Variables)。然而,操作系统和某些底层系统库可能会在它们的实现中使用这类指令。
请详细阅读这部分内容: 这条指令将交换 ***AX***
和 ***BX***
两个寄存器中的值。**
此时我们再回头看交换完之后, CX
的值是原本(AX)
的内容, 而(AX)
被写入了我们的预期值, 那么后续将CX写回SP就完成了.