为了账号安全,请及时绑定邮箱和手机立即绑定

sync / atomic.once.go中的两个原子样式代码是否必要?

sync / atomic.once.go中的两个原子样式代码是否必要?

Go
小唯快跑啊 2021-05-13 18:54:03
sync / atomic.once.go中的代码是:func (o *Once) Do(f func()) {        if atomic.LoadUint32(&o.done) == 1 { //A        //if o.done == 1 {            return        }        // Slow-path.        o.m.Lock()        defer o.m.Unlock()        if o.done == 0 {            f()            atomic.CompareAndSwapUint32(&o.done, 0, 1) //B            //o.done = 1        }    }我不认为上面两个“原子样式”代码A,B是必要或有用的。我认为锁就足够了,如果A,B不是原子样式也可以。我必须错过一些事情,请好心告诉我代码A,B的目的。谢谢你。
查看完整描述

1 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

原来是正确的。原因是Go内存模型说,如果没有同步(if o.done == 1),可能根本不会观察到对o.done的更改。


查看完整回答
反对 回复 2021-05-31
  • 1 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信