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

问题描述:

在同步代码/ atomic.once.go是:同步/ 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的目的。 谢谢。

original是正确的。原因是Go Memory Model表示,如果没有同步(if o.done == 1),可能完全不会观察到o.done的更改。

+0

我认为你是对的。看来我错过了很重要。谢谢。 – hardPass 2013-02-27 16:12:19