shad-go/cond/README.md
2022-03-08 18:56:01 +03:00

2.1 KiB
Raw Permalink Blame History

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, если очередь пустая.