正确地使用在多个goroutine中使用waitgroup

在使用waitgroup等待goroutine执行完成的时候,遇到了这样一个问题,有很多goroutine没有执行完成,程序就退出了。

我的代码是这样的:

var (
    wg *sync.WaitGroup
)

func myFunc() {
    wg.Add(1)
    defer wg.Done()
    xxxxxxx
}

func main() {
    for i:=1;i<5;i++ {
        go myFunc()
    }
    wg.Wait()
}

经过查阅资料,发现问题出在如果将waitgroup的Add操作放在goroutine里,可能在goroutine生成并执行wg.Add操作之前,主线程就进入了wait状态,并发现没有需要等待的goroutine,因此程序退出。

于是乎,将程序改成这样,边可以顺利执行:

var (
    wg sync.WaitGroup
)

func myFunc() {
    defer wg.Done()
    xxxxxxx
}

func main() {
    for i:=1;i<5;i++ {
        wg.Add(1)
        go myFunc()
    }
    wg.Wait()
}

同时,还有一个问题值得注意,如果WaitGroup以变量方式传入,若传入的是值(副本),而非使用指针来传引用,会导致wg.Done()不能给到原本的变量上,从而导致死锁,所以在此强调在传WaitGroup变量时一定要使用指针。(当然,像上面我自己写的那样直接用全局变量也是可以的)