shad-go/waitgroup/README.md

30 lines
1.4 KiB
Markdown
Raw Normal View History

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`.