waitgroup的微妙之处

本文探讨了Go语言中WaitGroup的正确使用方法,强调了add和done操作的同步问题。通过具体代码示例,解析了WaitGroup的工作原理,包括在协程中的应用及可能的误用情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实我之前理解说waitgroup的add和done无法同步,当时就觉得很奇怪

for(i  = 1;i <3 ;i++)
{
add(3)
go func(){

done
}()
wait
}

看过源码的都知道,done其实就是add,那么如果说我协程运行的很快,比方说我现在第一个协程都运行完了,然后
我去做这个wait,那这算不算同步呢??

再比方说吧
for(3)
{
go func()
{
add(1)

done
}
}
wait

其实这种包装的wait用法还是比较常见的,那么这么用会不会出问题呢???
答案是会,如果wait在add之前拿他肯定直接ok。
那如果wait在第一个add后,最后一个done前呢,其实这时候就不会出问题。
因为此时这个wait只是等待这一个done罢了。

waitgroup能够让已经done的wait也没关系。

但是如果全部done已经做到只剩最后一个,然后你中间把之前所有的wait都加进去更改了变量,这个其实是可以的。

但你不能在最后一个done执行的时候在这中间又把所有wait做完,这个就不行了。

就是说不能add到一半再wait做完再去add,这样就会很尴尬。。。

但由于done其实就是变相的add。

if w != 0 && delta > 0 && v == int32(delta) {
		panic("sync: WaitGroup misuse: Add called concurrently with Wait")
	if *statep != state {
		panic("sync: WaitGroup misuse: Add called concurrently with Wait")
	}
	

检测其实没有很严谨。

简单来讲就是第一个add必须在wait之前。

//add还没成功呢你就要wait

然后最后一个done也不能被wait中断,还是很严谨的。

//明明大家都已经做完了,你却wait等待

这个语言的细微之处还是很微妙的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值