2021-03-05 11:31:48 +00:00
|
|
|
|
## waitgroup
|
|
|
|
|
|
|
|
|
|
[sync.WaitGroup](https://golang.org/pkg/sync/#WaitGroup) решает задачу ожидания завершения всех горутин из набора.
|
|
|
|
|
|
|
|
|
|
### Что нужно сделать?
|
|
|
|
|
|
2022-03-06 02:06:00 +00:00
|
|
|
|
Нужно написать реализацию WaitGroup, используя каналы.
|
2021-03-05 11:31:48 +00:00
|
|
|
|
|
|
|
|
|
Использование пакета [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` может быть "переиспользована".
|
2022-03-06 02:06:00 +00:00
|
|
|
|
После достижения нуля можно вызвать `Add`, заблокировав последующий `Wait`.
|