> Что такое condition variable в синхронизации (Go)
Уровень: junior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: VK
Стек: Go
> Пример ответа
Condition variable (условная переменная) - это примитив синхронизации, который позволяет горутинам ожидать наступления определенного условия и уведомлять друг друга о его изменении. В Go condition variable реализуется через структуру sync.Cond, которая всегда связана с мьютексом (sync.Locker).
Основной механизм работы: горутина блокирует мьютекс, проверяет условие (например, наличие данных в очереди), и если условие не выполнено, вызывает Wait(). Этот метод атомарно разблокирует мьютекс и приостанавливает горутину до получения сигнала. Когда другая горутина изменяет состояние (например, добавляет данные), она вызывает Signal() (для пробуждения одной ожидающей горутины) или Broadcast() (для всех). После пробуждения Wait() автоматически перезахватывает мьютекс, и горутина повторно проверяет условие.
Пример использования в Go:
GOvar mu sync.Mutexcond := 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 на ожидание.
> Похожие задачи по Go
Какие проблемы могут возникнуть при возвращении внутренней мапы напрямую в Go
Какие методы у мьютекса для блокировки на чтение и запись в Go
Как расположены ключи и значения в бакетах хэш-таблицы в Go?
Что такое полиморфизм в Go
> Похожие задачи по backend
Какие проблемы могут возникнуть при возвращении внутренней мапы напрямую в Go
Какие методы у мьютекса для блокировки на чтение и запись в Go
Как расположены ключи и значения в бакетах хэш-таблицы в Go?
Что такое полиморфизм в Go
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью