sync.Once.Do () с использованием CompareAndSwapInt32 - PullRequest
0 голосов
/ 10 октября 2018

Go реализует sync.Once следующим образом:

type Once struct {
    m    Mutex
    done uint32
}

func (o *Once) Do(f func()) {
    if atomic.LoadUint32(&o.done) == 1 {
        return
    }
    // Slow-path.
    o.m.Lock()
    defer o.m.Unlock()
    if o.done == 0 {
        defer atomic.StoreUint32(&o.done, 1)
        f()
    }
}

Я пытаюсь понять необходимость мьютекса, что может быть проблемой с его реализацией следующим образом?

func (o *Once) Do(f func()) {
  if atomic.CompareAndSwapUInt32(&o.done, 0, 1) {
    f()
  }
}

1 Ответ

0 голосов
/ 10 октября 2018

Удаление мьютекса нарушает одно из задокументированных действий :

ни один вызов Do не возвращается, пока один вызов f не вернет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...