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

时间:2013-02-27 15:14:26

标签: go

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 个答案:

答案 0 :(得分:4)

original是正确的。原因是Go Memory Model表示,如果没有同步(if o.done == 1),可能根本无法观察到对o.done的更改。