Назад к вопросам
VK
Middle
4
Как работает conditional variable (sync.Cond) в Go?
Компании, где спрашивали
Ответ от нейросети
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 позволяет эффективно синхронизировать выполнение горутин на основе изменения состояния.