Sync.Once.Do () с использованием CompareAndSwapInt32

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()
  }
}
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
0
271
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

no call to Do returns until the one call to f returns

Другие вопросы по теме