Go sync.WaitGroup.Done()实际上是如何工作的?
我为一个创建4个goroutine的程序运行了下面的代码,根据我得到的输出,我的代码似乎运行正常,但它给出了错误:-致命错误:所有goroutine都处于休眠状态-死锁 我添加了4个waitgroup,当每个goroutines完成时,我都做了wg.Done,但我仍然不明白为什么会发生这样的错误 我的代码:Go sync.WaitGroup.Done()实际上是如何工作的?,go,goroutine,Go,Goroutine,我为一个创建4个goroutine的程序运行了下面的代码,根据我得到的输出,我的代码似乎运行正常,但它给出了错误:-致命错误:所有goroutine都处于休眠状态-死锁 我添加了4个waitgroup,当每个goroutines完成时,我都做了wg.Done,但我仍然不明白为什么会发生这样的错误 我的代码: 实际上,我没有遇到死锁,但遇到了另一个错误:panic:sync:negative WaitGroup counter 将4添加到waitgroup: wg.Add(4) 您可以在4个启动
实际上,我没有遇到死锁,但遇到了另一个错误:panic:sync:negative WaitGroup counter 将4添加到waitgroup:
wg.Add(4)
您可以在4个启动的goroutine中调用wg.Done。那很好
但在main中还有最后一个排序调用:
和内部工作组。完成也将被称为:
panic: sync: negative WaitGroup counter
一个简单的解决方法是在调用sort之前向waitgroup添加一个:
这总共是5个排序调用,意味着5个wg.Done,但是您只添加了wg.Add4。这导致了
panic: sync: negative WaitGroup counter
此代码不可能产生您显示的错误。它不使用任何通道,因此无法在chan send上阻止goroutine 1。
sort(final)
panic: sync: negative WaitGroup counter
wg.Add(1)
sort(final)
panic: sync: negative WaitGroup counter