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

上記の 2 つの「アトミック スタイル」のコード A、B は必要でも有用でもないと思います。ロックで十分だと思います。A、B がアトミック スタイルでなくても問題ありません。コード A、B の目的を教えてください。ありがとうございました。

4

1 に答える 1

4

原文は正しい。その理由は、同期 ( ) がなければ、o.done への変更がまったく観察されない可能性があると、Goメモリ モデルが述べているからです。if o.done == 1

于 2013-02-27T15:29:38.133 に答える