func BencmarkWg(b *testing.B){
for i:=0;i< b.N;i++{
wg()
}
}
func wg() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
wg.Wait()
}
go func() {
wg.Done()
}
wg.Add(1)这一行会触发错误
}
原理:
根据WaitGroup的源码:
调用Wait之后,wait内部会进行waiter的检查和等待,当发现waiter为0,会进入下一步,如果在进入下一步之前外部又调用了Add,即waiter的值会变成非0,则会触发该问题
。。。。
runtime_Semacquire(unsafe.Pointer(semap))///等待waiter变成0,即之前提交的所有协程执行完
if *statep != 0 { //发现又不是0,即在这一步之前,外部调用了Add
panic("sync:WaitGroup is reused before previous Wait has returned")
}
。。。。。
总结:
1.wg本身是可以服用,即Wait()完后,再继续add,再wait()
2.wait()的过程中,不能Add,即wait()和add不能并发