使用并发Go例程时,处理同步对于避免死锁至关重要。当尝试协调多个 goroutine 并使用sync.WaitGroup 等待它们完成时,就会出现这样的一种情况。然而,有时,你可能会遇到错误:“致命错误:所有 goroutine 都在睡眠 - 死锁!”。
此错误源于sync.WaitGroup 的错误使用。在提供的代码片段中:
import "sync" func doWork(wg sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
问题在于将sync.WaitGroup对象直接传递给doWork函数。当按值传递值时,会创建对象的副本,这会导致意外行为。
修复涉及将指针传递给sync.WaitGroup:
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
通过传递一个指针,每个 goroutine 将引用相同的 WaitGroup 对象,确保在预期实例上调用 Done() 。这解决了死锁问题,让程序能够无错误地执行。
记住,当使用sync.WaitGroup同步goroutine时,一定要传递一个指向对象的指针,以确保行为一致并避免潜在的死锁。
以上是使用Go的sync.WaitGroup时如何避免死锁?的详细内容。更多信息请关注PHP中文网其他相关文章!