2.1 KiB
2.1 KiB
cond
sync.Cond — примитив синхронизации для эффективных межгорутинных нотификаций.
Обычно использование выглядит так: одни горутины ждут выполнения некоторого условия, а другие горутины выполняют это условие и информируют ждущих.
Что нужно сделать?
Нужно написать реализацию Cond используя каналы.
Использование пакета sync в этой задаче запрещено!
type Cond struct {
L Locker
}
func New(l Locker) *Cond {}
func (c *Cond) Wait() {}
func (c *Cond) Signal() {}
func (c *Cond) Broadcast() {}
Locker
это sync.Locker, но мы не хотим использовать sync.
У каждого Cond
есть блокировка L
, передающаяся в конструкторе.
Cond
поддерживает FIFO очередь ожидающих горутин.
Wait()
паникует, еслиL
не взята.Wait()
добавляет текущую горутину в очередь, возвращает блокировкуL
, блокирует текущую горутину. Заснувшая горутина может быть разбужена другой горутиной через вызовSignal()
илиBroadcast()
. При просыпании засыпавшая горутина продолжит исполнение, возьмётL
и завершит вызовWait()
.Signal()
извлекает и разблокирует первую блокировку из очереди, если такая есть, иначе no-op.Broadcast()
извлекает и разблокирует все блокировки из очереди. no-op, если очередь пустая.