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 — защищает данные от одновременного доступа.