atomic.StoreInt64
源码
依然将细节隐藏了起来, 沟槽的
TEXT sync∕atomic·StoreInt64(SB), NOSPLIT|NOFRAME, $0-16
GO_ARGS
MOVQ $__tsan_go_atomic64_store(SB), AX
CALL racecallatomic<>(SB)
RET
汇编
解释
-
把
2
移入CX -
调用
XCHGQ
, 来原子性的修改 CX 和 (AX) 的值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)。然而,操作系统和某些底层系统库可能会在它们的实现中使用这类指令。
总结
Store的底层实现还是依赖于汇编指令的, 这也是经典的底层结构影响上层建筑的一个小例子吧.
值得注意的是, XCHG
的速度是不快的, 尤其是一些老一点的计算机, 这一点稍微提一下, 但是说到底也只是一个指令而已.