1.4 KiB
1.4 KiB
waitgroup
sync.WaitGroup решает задачу ожидания завершения всех горутин из набора.
Что нужно сделать?
Нужно написать реализацию WaitGroup, используя каналы.
Использование пакета sync в этой задаче запрещено!
type WaitGroup struct {}
func (wg *WaitGroup) Add(delta int) {}
func (wg *WaitGroup) Done() {}
func (wg *WaitGroup) Wait() {}
WaitGroup
можно представлять себе как число.
- При инициализации переменной типа
WaitGroup
число равно нулю. - Вызов
Add
прибавляетdelta
к числу. - Вызов
Done
вычитает из числа единицу. - Если при вызове
Add
илиDone
число становится отрицательным, происходит panic. - Вызов
Wait
при числе равном нулю -- это no-op. - Вызов
Wait
при числе большем нуля блокируется до тех пор, пока число не станет равным нулю.
WaitGroup
может быть "переиспользована".
После достижения нуля можно вызвать Add
, заблокировав последующий Wait
.