是golang atomic.LoadUint32必要吗?

时间:2017-10-04 04:07:59

标签: go atomicity

Golang的原子包提供了函数func LoadUint32(addr *uint32) (val uint32)。我查看了程序集实现:

TEXT ·LoadUint32(SB),NOSPLIT,$0-12
MOVQ    addr+0(FP), AX
MOVL    0(AX), AX
MOVL    AX, val+8(FP)
RET

基本上从内存地址加载值并返回它。 我想知道我们是否有一个uint32指针(地址)x,调用atomic.LoadUint32(x)并使用*x直接访问它有什么区别?

1 个答案:

答案 0 :(得分:6)

  

基本上从内存地址加载值并返回它。

在您的上下文中就是这种情况,但在要实施 atomicity 的其他计算机体系结构上可能会有所不同。discussed here
go issue 8739

中所述
  

我们对sync/atomicruntime/internal/atomic进行了一系列架构的介入   API未统一(例如,LoadUint32中的sync/atomicLoad中为runtime/internal/atomic)。

(*" intrinsify"如同issue 4947

正如我在第一个链接中提到的那样:

  

关于装载和存储。

     

内存模型以及指令集指定普通加载和存储是否为原子。所有现代商品硬件的典型保证是对齐的字大小的装载和存储是原子的。例如,在x86架构(IA-32和Intel 64)上,1对,2个,4个,8个和16个字节对齐的加载和存储都是原子的(即普通MOV指令,{{ 1}}和MOVQ是原子的。