我有一个带有多个goroutine的go程序。我遇到此错误,我不知道为什么。这是我的代码逻辑:
main.go
for {
...
go funcFile2()
}
在File2.go中定义了funcFile2的地方,并在某种循环中多次调用
File2.go
var wg sync.WaitGroup
func func1(){
defer wg.Done()
return
}
func func2(){
defer wg.Done()
return
}
func func3(){
defer wg.Done()
return
}
func funcFile2(){
wg.Add(3)
go func1()
go func2()
go func3()
wg.Wait()
}
GO版本:go1.12.7
我该如何解决?
答案 0 :(得分:2)
如果从多个goroutine中调用funcfile2(),则它们都共享相同的WaitGroup wg,这是有效的。之所以会出现此错误,是因为在其中一个goroutine中调用了wg.Wait(),然后在另一个goroutine中调用了wg.Add(3),这是无效的。一旦等待组开始,您就无法添加更多内容。
对于每个调用funcfile2()的goroutine,您必须有一个单独的等待组。如果这是在for循环中,则可以执行以下操作:
for {
wg:=sync.WaitGroup{}
go funcfile2(&wg)
}
这样,每个调用funcfile2的goroutine将使用其自己的等待组。当然,funcfile2必须将相同的等待组传递给它创建的goroutine。