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
直接访问它有什么区别?
答案 0 :(得分:6)
基本上从内存地址加载值并返回它。
在您的上下文中就是这种情况,但在要实施 atomicity 的其他计算机体系结构上可能会有所不同。discussed here。
如go issue 8739
我们对
sync/atomic
和runtime/internal/atomic
进行了一系列架构的介入 API未统一(例如,LoadUint32
中的sync/atomic
在Load
中为runtime/internal/atomic
)。
(*" intrinsify"如同issue 4947)
正如我在第一个链接中提到的那样:
关于装载和存储。
内存模型以及指令集指定普通加载和存储是否为原子。所有现代商品硬件的典型保证是对齐的字大小的装载和存储是原子的。例如,在x86架构(IA-32和Intel 64)上,1对,2个,4个,8个和16个字节对齐的加载和存储都是原子的(即普通
MOV
指令,{{ 1}}和MOVQ
是原子的。