sync.WaitGroup 与外部函数的最佳使用
问题:
实现同步。具有外部函数的 WaitGroup 在尝试打印数字 1 到 11 时导致死锁。具体来说,错误发生在 wg.Wait() 行。
解决方案 1(错误方法):
设置 wg.Add(1) 而不是 2 是一个不正确的解决方案,因为它没有解决根本问题。
解决方案 2(改进的方法):
修改代码如下:
<code class="go">package main import ( "fmt" "sync" ) func main() { ch := make(chan int) var wg sync.WaitGroup wg.Add(2) go Print(ch, &wg) go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) wg.Done() }() wg.Wait() //deadlock here } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // reads from channel until it's closed fmt.Println(n) } wg.Done() }</code>
说明:
将 wg 的地址传递给 Print 可确保操作同一个 WaitGroup 实例。从 Print 函数签名中删除 wg 消除了函数了解外部 WaitGroup 的需要。
结论:
第二种解决方案是一种更稳健的方法,可以避免死锁并保持 Print 函数与 wg 的独立性。
以上是将sync.WaitGroup与外部函数一起使用时如何避免死锁?的详细内容。更多信息请关注PHP中文网其他相关文章!