【问题标题】:Is atomic.LoadUint32 necessary?atomic.LoadUint32 是必要的吗?
【发布时间】:2017-10-04 04:07:58
【问题描述】:

Go 的 atomic 包提供函数 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直接访问它有什么区别?

【问题讨论】:

  • 第一个保证是原子的,第二个不是。

标签: go atomic


【解决方案1】:

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

在您的上下文中就是这种情况,但在要实现 atomicity 的不同机器架构上可能会有所不同,如 discussed here
go issue 8739中所述

我们将sync/atomicruntime/internal/atomic 内化为一堆架构。
API 不统一(例如sync/atomic 中的LoadUint32runtime/internal/atomic 中的Load)。

(* "intrinsify" 如issue 4947)

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

关于加载和存储。

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

【讨论】:

    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多