【问题标题】:why should we use atomic.LoadPointer? [duplicate]我们为什么要使用 atomic.LoadPointer? [复制]
【发布时间】:2021-04-28 11:40:26
【问题描述】:

指针值有一个机器字的长度,所以读/写操作自然应该是原子的。只要我们不改变指针指向的东西,我们是否可以只使用指向结构的指针并同时访问它?

type A struct{
    x int
    y int
    z int
}
var v *A
func main(){
    v = &A{}
    go func(){
        u := v
        fmt.Print(u.x)
        fmt.Print(u.y)
        fmt.Print(u.z)
        //will it only print 000 or 111?
    }()
    go func(){
        u := &A{x:1, y:1, z:1}
        v = u
    }()
}

【问题讨论】:

    标签: go


    【解决方案1】:

    一个指针值的长度是一个机器字

    是的

    所以读/写操作自然应该是原子的

    错误

    只要不改变指针指向的东西,我们可以只使用指向结构的指针并同时访问它吗?

    (顺便说一句:您的示例代码包含数据竞争,这是未定义的。)

    没有。

    80 年代及其 8 位或 16 位微控制器早已不复存在。仅仅因为某些东西具有机器字的大小,它根本不会使其读/写原子。

    回答您的问题“我们为什么要使用 atomic.LoadPointer?”:如果您想以原子方式加载指针而不进行其他同步,则应始终使用它。

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 1970-01-01
      • 2012-10-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 2020-01-29
      • 2019-09-17
      • 2018-11-02
      相关资源
      最近更新 更多