sync.WaitGroup中要求Wait的时候不能Add,这样做的原因是什么呢?

kiwi-yan · · 1367 次点击
代码大致如下,是公司一个不成熟的框架,问题已经改掉了,现在想对这个原理探究一下 ``` // 主逻辑 go Do() <- a.close // a是一个channel定义在其他位置,发现异常就会close掉 // 此时Do内可能才执行到DoSomething_1(), 所以会导致Wait以后执行Add,这个时候就会panic wg.Wait() // Do函数定义如下 func Do() { for { select { case <- a.close: return default: DoSomething_0() go func() { DoSomething_1() wg.Add(1) go func() { defer wg.Done() DoSomething_2() }() DoSomething_3() }() } } } ```
#5
更多评论
哪里写了不能add? 一般场景不应该是wait的时候add吗?当所有gorouitne执行完才结束?
#1
比如有两个goroutine,第一个里面有wg.Wait(),第二个里面有wg.Add(1),Add()比Wait()晚一些运行 就会报错 ![截图.png](https://static.studygolang.com/170928/ab02e4e94cab6ea6eb237cf7e12da317.png)
#2