🟡 Средний · 2 очк. Пакет sync
Для чего нужен sync.Cond?
A Для ограничения числа горутин
B Для ожидания условия: Wait атомарно отпускает мьютекс и засыпает, Signal будит одну горутину, Broadcast - все
C Для подсчета горутин
D Для однократного выполнения функции
Объяснение вопроса

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).

🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.