douxiuyu2028 2013-02-27 15:14
浏览 45
已采纳

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

The code in sync/atomic.once.go is :

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
        }
    }

I don't think the two 'atomic-style' code A,B above is necessary or useful. I think the lock is enough, and it could be ok if A,B are not atomic style. I must miss something, please be kind to tell me the purpose of the code A,B. Thank you.

  • 写回答

1条回答 默认 最新

  • dqqfuth6736 2013-02-27 15:29
    关注

    The original is correct. The reason is that the Go Memory Model says, that without synchronization (if o.done == 1) the changes to o.done might not be observed at all.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料