Sobes.tech
Назад к вопросам
Middle+
3

Какие примитивы синхронизации горутин существуют в Go?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

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

  • Mutex (sync.Mutex) — обеспечивает взаимное исключение, блокируя доступ к разделяемым ресурсам.
  • RWMutex (sync.RWMutex) — расширение Mutex, позволяющее нескольким горутинам читать одновременно, но блокирует запись.
  • WaitGroup (sync.WaitGroup) — позволяет ждать завершения набора горутин.
  • Channel (chan) — канал для передачи данных между горутинами, обеспечивает синхронизацию через передачу сообщений.
  • Once (sync.Once) — гарантирует, что определённая функция выполнится только один раз.
  • Cond (sync.Cond) — условная переменная для более сложной синхронизации, например, ожидания определённого состояния.

Пример использования WaitGroup и Mutex:

var mu sync.Mutex
var wg sync.WaitGroup
var counter int

func increment() {
    defer wg.Done()
    mu.Lock()
    counter++
    mu.Unlock()
}

func main() {
    wg.Add(3)
    go increment()
    go increment()
    go increment()
    wg.Wait()
    fmt.Println("Counter:", counter)
}