Sobes.tech
Back to questions
Middle
3

Как работает conditional variable (sync.Cond) в Go?

Companies where asked
VKVK

Answer from AI

sobes.tech AI

В Go sync.Cond — это условная переменная, которая используется для координации горутин, позволяя одной или нескольким горутинам ждать наступления определенного условия.

Основные методы:

  • Wait(): блокирует текущую горутину и освобождает связанный mutex, пока не будет вызван Signal() или Broadcast().
  • Signal(): пробуждает одну горутину, ожидающую на условной переменной.
  • Broadcast(): пробуждает все горутины, ожидающие на условной переменной.

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

var mu sync.Mutex
cond := sync.NewCond(&mu)

// Горутинa, которая ждет условия
go func() {
    mu.Lock()
    cond.Wait() // ждем сигнала
    // условие выполнено
    mu.Unlock()
}()

// Горутинa, которая сигнализирует
mu.Lock()
// меняем состояние, которое ждет первая горутина
cond.Signal() // или cond.Broadcast()
mu.Unlock()

Важно, что Wait() должен вызываться с заблокированным mutex, и при вызове Wait() mutex временно освобождается, чтобы другие горутины могли изменить состояние и вызвать Signal() или Broadcast(). После пробуждения Wait() снова блокирует mutex перед возвратом.

Таким образом, sync.Cond позволяет эффективно синхронизировать выполнение горутин на основе изменения состояния.