sync.Cond - примитив синхронизации для ожидания наступления условия. Связан с мьютексом:
var mu sync.Mutex
cond := sync.NewCond(&mu)
queue := []int{}
// Потребитель
go func() {
mu.Lock()
defer mu.Unlock()
for len(queue) == 0 {
cond.Wait() // атомарно: Unlock + sleep + Lock при пробуждении
}
item := queue[0]
queue = queue[1:]
fmt.Println(item)
}()
// Производитель
mu.Lock()
queue = append(queue, 42)
mu.Unlock()
cond.Signal() // разбудить одного ждущего
// cond.Broadcast() // разбудить всех ждущих
Wait() атомарно отпускает мьютекс и засыпает; при пробуждении снова захватывает мьютекс. Signal() будит одну горутину, Broadcast() - все.
На практике каналы часто удобнее sync.Cond, но Cond незаменим, когда нужно разбудить всех ожидающих (Broadcast).