🟡 Средний · 2 очк. Модель памяти Go
Какая операция НЕ создает happens-before гарантию между горутинами?
A Отправка в канал
B sync.Mutex.Unlock()
C Присваивание обычной переменной без синхронизации
D sync.WaitGroup.Done()
Объяснение вопроса

Чтение и запись обычных переменных без синхронизации не создают happens-before. Даже если одна горутина записала значение, другая может не увидеть его - или увидеть частично записанное значение.

var x, y int

// Горутина 1
go func() {
    x = 1
    y = 2
}()

// Горутина 2 - может увидеть:
// x=0,y=0 (еще не записано)
// x=0,y=2 (переупорядочивание)
// x=1,y=0 или x=1,y=2
fmt.Println(x, y) // data race!

Операции с happens-before гарантией:

  • ch <- v / <-ch - канальные операции
  • mu.Lock() / mu.Unlock() - мьютексы
  • wg.Done() / wg.Wait() - WaitGroup
  • atomic.Store / atomic.Load - атомарные операции
  • once.Do(f) - однократное выполнение
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.