> Что такое condition variable в синхронизации (Go)

Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: VK

Стек: Go

> Пример ответа

Condition variable (условная переменная) - это примитив синхронизации, который позволяет горутинам ожидать наступления определенного условия и уведомлять друг друга о его изменении. В Go condition variable реализуется через структуру sync.Cond, которая всегда связана с мьютексом (sync.Locker).

Основной механизм работы: горутина блокирует мьютекс, проверяет условие (например, наличие данных в очереди), и если условие не выполнено, вызывает Wait(). Этот метод атомарно разблокирует мьютекс и приостанавливает горутину до получения сигнала. Когда другая горутина изменяет состояние (например, добавляет данные), она вызывает Signal() (для пробуждения одной ожидающей горутины) или Broadcast() (для всех). После пробуждения Wait() автоматически перезахватывает мьютекс, и горутина повторно проверяет условие.

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

GO
var mu sync.Mutex
cond := sync.NewCond(&mu)
queue := []int{}
// Потребитель
go func() {
mu.Lock()
for len(queue) == 0 {
cond.Wait() // ждем, пока очередь не станет непустой
}
item := queue[0]
queue = queue[1:]
mu.Unlock()
}()
// Производитель
go func() {
mu.Lock()
queue = append(queue, 42)
cond.Signal() // уведомляем одного ожидающего
mu.Unlock()
}()

Важно: условие всегда проверяется в цикле (for), а не в if, чтобы защититься от ложных пробуждений (spurious wakeups). Condition variable эффективнее busy wait (циклической проверки), так как не тратит ресурсы CPU на ожидание.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью