Загрузка…
Загрузка…
sync.Cond — примитив условной синхронизации: он позволяет горутинам ждать, пока определенное состояние (условие) не станет истинным, и пробуждаться по сигналу от другой горутины.
sync.Cond:Cond работает поверх Locker (обычно *sync.Mutex).
Подпрограмма в цикле проверяет состояние блокировки.
Если условие ложное — вызывает Wait().
Другая горутина вызывает Signal() или Broadcast() после изменения состояния.
Wait() — атомарно снимает блокировку, засыпает и после пробуждения
вверх снова хватает замок.
Signal() — пробуждает одну ожидающую горутину.
Broadcast() - будит всех ждущих.
sync.Cond:Сложное условие общего состояния, а не передачи сообщения: когда оно важно дождаться «предиката над состоянием» и не получать полезную нагрузку.
Много ожидающих на одном ресурсе, защищенном блокировкой: Cond более естественно
выражает координацию вокруг общего состояния.
Требуется точный контроль пробуждения: Signal/Broadcast иногда лучше
подходит, чем семантика канала.
Высокочастотные сценарии с минимальным шумом распределения: в некоторых случаях
низкоуровневых случаях, Cond дает более эффективную модель, чем построение дополнительных
канальные протоколы.
Когда стоит задача передать событие/данные между независимыми субъектами.
Когда важны простая модель конвейера и читаемый поток сообщений.
Когда вы не хотите управлять общим изменяемым состоянием под блокировкой.
sync.Cond — это инструмент «ожидания изменения условия мьютекса», а канал — это инструмент «передачи сообщения». Cond преобладает там, где центром логики является само состояние и его инварианты, а не транспорт данных.
sync.Cond — примитив условной синхронизации: он позволяет горутинам ждать, пока определенное состояние (условие) не станет истинным, и пробуждаться по сигналу от другой горутины.
