🔴 Сложный · 3 очк. Модель памяти Go
Что гарантирует модель памяти Go (Go Memory Model)?
A Порядок аллокаций на куче
B При каких условиях чтение переменной в одной горутине гарантированно увидит значение, записанное в другой (happens-before)
C Размер стека горутины
D Порядок вызова defer
Объяснение вопроса

Go Memory Model описывает условия, при которых чтение переменной в одной горутине гарантированно видит значение, записанное в другой. Центральное понятие - happens-before: если событие A happens-before события B, то результаты A видны в B.

Операции, создающие happens-before:

  • Отправка в канал happens-before получение из этого канала
  • sync.Mutex.Unlock() happens-before следующий Lock() того же мьютекса
  • sync.WaitGroup.Done() happens-before возврат из Wait()
  • sync.Once.Do(f) - выполнение f happens-before возврат из любого Do()
  • Запуск горутины (go f()) happens-before начала выполнения f()

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

var x int
var done = make(chan struct{})

go func() {
    x = 42           // запись
    close(done)      // happens-before
}()
<-done              // гарантированно видим x == 42
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.