Проверяет знание менее распространённых примитивов синхронизации и понимание, где каналы неэффективны.
sync.Cond — это условная переменная, позволяющая одной или нескольким горутинам ждать события, пока другая не вызовет Signal или Broadcast.
Она эффективнее каналов, когда нужно разбудить несколько горутин, ожидающих одинаковое условие.
sync.Cond используется как низкоуровневый инструмент для организации ожидания состояния:
var mu sync.Mutex
cond := sync.NewCond(&mu)
ready := falseГорутина-ожидатель:
mu.Lock()
for !ready {
cond.Wait() // ждёт Signal
}
mu.Unlock()Горутина-сигнализатор:
mu.Lock()
ready = true
cond.Signal() // или cond.Broadcast()
mu.Unlock()Wait() — отпускает мьютекс и блокирует горутину.
Signal() — будит одну горутину.
Broadcast() — будит всех ожидающих.
Используется:
при реализации собственных worker pool-ов, кэшей, очередей;
когда нужно «ожидание условия», а не просто синхронизация по каналам.
Вывод:
sync.Cond эффективен для событийного ожидания состояния, когда каналы создают лишние аллокации и overhead.