typora/daliy_note/10.24/waitgroup.md
2024-12-12 10:48:55 +08:00

1.5 KiB

在 Go 语言中,你可以传递 sync.WaitGroup 的指针。这在并发编程中是一个常见的模式,因为 sync.WaitGroup 的方法(如 AddDoneWait)会修改 WaitGroup 的内部状态,所以通常需要通过指针传递以避免复制。

使用 sync.WaitGroup 时,通过指针传递的典型用法如下:

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 中正确地共享和管理等待组的状态。