sync / atomic.once.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的目的。谢谢你。


小唯快跑啊
浏览 242回答 1
1回答

白衣非少年

在原来是正确的。原因是Go内存模型说,如果没有同步(if o.done == 1),可能根本不会观察到对o.done的更改。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go