Golang的sync.WaitGroup陷阱

本文探讨了Golang中sync.WaitGroup的常见陷阱,解释了为何在协程中延迟调用Add可能导致主程序提前结束。通过分析问题原因,强调Add必须在Wait之前调用,并提供了解决方案,确保所有协程正确执行完毕。
摘要由CSDN通过智能技术生成

sync.WaitGroup是并发环境中,一个相当常用的数据结构,用来等待所有协程的结束,在写代码的时候都是按着例子的样子写的,也没用深究过它的使用。前几日想着能不能在协程中执行Add()函数,答案是不能,这里介绍下。

陷阱在WaitGroup的3个函数的调用顺序上。先回顾下3个函数的功能:

  1. Add(delta int):给计数器增加delta,比如启动1个协程就增加1。
  2. Done():协程退出前执行,把计数器减1。
  3. Wait():阻塞等待计数器为0。

考一考

下面的程序是创建了协程father,然后father协程创建了10个子协程,main函数等待所有协程结束后退出,看看下面代码有没有什么问题?

package main

import (
	"fmt"
	"sync"
)

func father(wg *sync.WaitGroup) {
   
	wg.Add(1)
	defer wg.Done()

	fmt.Printf("father\n")
	for i := 0; i < 10; i++ {
   
		go child
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值