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
Run Code Online (Sandbox Code Playgroud)
它基本上从内存地址加载值并返回它.我想知道我们是否有一个uint32指针(addr)x,调用atomic.LoadUint32(x)和使用它直接访问它有什么区别*x?
它基本上从内存地址加载值并返回它.
在您的上下文中就是这种情况,但在可能实现原子性的不同机器架构上可能会有所不同,如此处所述.
正如8739问题所述
我们既对两者都进行了内化
sync/atomic,也runtime/internal/atomic为一堆架构进行了内化.
这些API不统一(例如,LoadUint32在sync/atomic为Load中runtime/internal/atomic).
(*问题4947中的 "内化" )
正如我在第一个链接中提到的:
关于装载和存储.
内存模型和指令集指定普通加载和存储是否是原子的.所有现代商品硬件的典型保证是对齐的字大小的装载和存储是原子的.例如,在x86架构(IA-32和Intel 64)上,1-,2-,4-,8-和16-字节对齐的加载和存储都是原子的(即普通
MOV指令,MOVQ并且MOVDQA是原子的).
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |