Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Golang: cond, mutex, concurrency

Что делает sync.Cond и в каких случаях его предпочтительнее использовать вместо каналов?

Проверяет знание менее распространённых примитивов синхронизации и понимание, где каналы неэффективны.

Короткий ответ

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.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • Golang

    Golang

Ключевые слова

#cond

#mutex

#concurrency

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.