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 の目的を教えてください。ありがとうございました。