Go sync.WaitGroup.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个启动

我为一个创建4个goroutine的程序运行了下面的代码,根据我得到的输出,我的代码似乎运行正常,但它给出了错误:-致命错误:所有goroutine都处于休眠状态-死锁

我添加了4个waitgroup,当每个goroutines完成时,我都做了wg.Done,但我仍然不明白为什么会发生这样的错误

我的代码:


实际上,我没有遇到死锁,但遇到了另一个错误: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