首页  >  文章  >  后端开发  >  将sync.WaitGroup与外部函数一起使用时如何避免死锁?

将sync.WaitGroup与外部函数一起使用时如何避免死锁?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-06 05:06:02659浏览

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

sync.WaitGroup 与外部函数的最佳使用

问题:

实现同步。具有外部函数的 WaitGroup 在尝试打印数字 1 到 11 时导致死锁。具体来说,错误发生在 wg.Wait() 行。

解决方案 1(错误方法):

设置 wg.Add(1) 而不是 2 是一个不正确的解决方案,因为它没有解决根本问题。

解决方案 2(改进的方法):

修改代码如下:

  • 在main函数中,使用&wg将sync.WaitGroup的地址传递给Print函数。
  • 去掉wg Print 函数签名中的参数。
<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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn