3

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 的用途。谢谢你。

4

1 回答 1

4

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

于 2013-02-27T15:29:38.133 回答