shad-go/cond
2024-06-05 20:36:34 +03:00
..
cond.go go fix old build tags. 2022-03-15 23:49:56 +03:00
cond_test.go Updated to the most recent version, which uses go 1.22 2024-06-05 20:36:34 +03:00
README.md fix 29 typos 2022-03-08 18:56:01 +03:00

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