29 lines
1.4 KiB
Markdown
29 lines
1.4 KiB
Markdown
## waitgroup
|
||
|
||
[sync.WaitGroup](https://golang.org/pkg/sync/#WaitGroup) решает задачу ожидания завершения всех горутин из набора.
|
||
|
||
### Что нужно сделать?
|
||
|
||
Нужно написать реализацию WaitGroup используя каналы.
|
||
|
||
Использование пакета [sync](https://golang.org/pkg/sync) в этой задаче запрещено!
|
||
|
||
```go
|
||
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`.
|