42 lines
1.5 KiB
Markdown
42 lines
1.5 KiB
Markdown
在 Go 语言中,你可以传递 `sync.WaitGroup` 的指针。这在并发编程中是一个常见的模式,因为 `sync.WaitGroup` 的方法(如 `Add`、`Done` 和 `Wait`)会修改 `WaitGroup` 的内部状态,所以通常需要通过指针传递以避免复制。
|
|
|
|
使用 `sync.WaitGroup` 时,通过指针传递的典型用法如下:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
func worker(id int, wg *sync.WaitGroup) {
|
|
defer wg.Done() // 确保在 goroutine 完成时调用 Done
|
|
fmt.Printf("Worker %d starting\n", id)
|
|
// 模拟工作
|
|
fmt.Printf("Worker %d done\n", id)
|
|
}
|
|
|
|
func main() {
|
|
var wg sync.WaitGroup
|
|
|
|
for i := 1; i <= 5; i++ {
|
|
wg.Add(1) // 增加 WaitGroup 的计数器
|
|
go worker(i, &wg) // 传递 WaitGroup 的指针
|
|
}
|
|
|
|
wg.Wait() // 等待所有 goroutine 完成
|
|
fmt.Println("All workers done")
|
|
}
|
|
```
|
|
|
|
### 说明
|
|
|
|
- **指针传递**: `worker` 函数接收一个 `*sync.WaitGroup` 类型的参数。这样,所有的 goroutine 都共享同一个 `WaitGroup` 实例,可以正确地递增和递减计数器。
|
|
|
|
- **Add、Done 和 Wait**:
|
|
- `Add(n int)`: 增加等待计数器的值。
|
|
- `Done()`: 减少等待计数器的值(通常在 goroutine 完成时调用)。
|
|
- `Wait()`: 阻塞直到等待计数器归零。
|
|
|
|
通过这种方式,可以确保主函数会等待所有启动的 goroutine 完成其任务。传递 `sync.WaitGroup` 的指针是 Go 中并发编程的一种惯用方法,确保在多个 goroutine 中正确地共享和管理等待组的状态。 |