doutao5499 2018-10-10 18:50
浏览 232
已采纳

使用CompareAndSwapInt32的sync.Once.Do()

Go implements the sync.Once as such:

type Once struct {
    m    Mutex
    done uint32
}

func (o *Once) Do(f func()) {
    if atomic.LoadUint32(&o.done) == 1 {
        return
    }
    // Slow-path.
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        defer atomic.StoreUint32(&o.done, 1)
        f()
    }
}

I'm trying to understand the need for the mutex here, what would be the issue with implementing it as this ?

func (o *Once) Do(f func()) {
  if atomic.CompareAndSwapUInt32(&o.done, 0, 1) {
    f()
  }
}
  • 写回答

1条回答 默认 最新

  • douzhan5058 2018-10-10 19:01
    关注

    Removing the mutex breaks one of the documented behaviours:

    no call to Do returns until the one call to f returns

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

报告相同问题?

悬赏问题

  • ¥15 关于大棚监测的pcb板设计
  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计