Sobes.tech
Back to questions
Middle
3

Какие примитивы синхронизации есть в Go? Расскажи про WaitGroup и Mutex.

Companies where asked
СБЕРСБЕР

Answer from AI

sobes.tech AI

В Go есть несколько примитивов синхронизации для управления конкурентным доступом к ресурсам и координации горутин:

  • Mutex (мьютекс) — обеспечивает взаимное исключение, блокируя доступ к критической секции кода. Используется для защиты общих данных от одновременного изменения.
  • WaitGroup — позволяет ждать завершения набора горутин. С помощью методов Add, Done и Wait можно синхронизировать выполнение.
  • Channel (каналы) — позволяют передавать данные между горутинами и могут использоваться для синхронизации.

WaitGroup

sync.WaitGroup используется для ожидания завершения нескольких горутин. Пример:

var wg sync.WaitGroup
wg.Add(3) // ожидаем 3 горутины

for i := 0; i < 3; i++ {
    go func(id int) {
        defer wg.Done() // сигнализируем о завершении
        fmt.Println("Горутина", id)
    }(i)
}

wg.Wait() // ждем, пока все Done вызовутся

Mutex

sync.Mutex защищает критическую секцию, чтобы только одна горутина могла выполнять её одновременно:

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()   // блокируем
    defer mu.Unlock() // разблокируем
    counter++
}

Таким образом, WaitGroup помогает ждать завершения горутин, а Mutex — защищает данные от одновременного доступа.