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的目的。 谢谢。