使用带有外部函数的sync.WaitGroup的最佳实践
在提供的代码片段中,您在尝试使用同步时遇到死锁.WaitGroup 具有外部函数。该错误源于错误地将 WaitGroup 的副本传递给外部函数,导致未在预期的 WaitGroup 上调用 Done() 方法。
要解决此问题,请确保将指针传递给而是等待组。通过这样做,外部函数可以访问正确的 WaitGroup 并适当地调用 Done()。下面是更正后的代码:
<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) // Pass a pointer to the WaitGroup go func() { for i := 1; i <= 11; i++ { ch <- i } close(ch) defer wg.Done() }() wg.Wait() // Wait for both goroutines to finish } func Print(ch <-chan int, wg *sync.WaitGroup) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } defer wg.Done() }</code>
或者,您可以修改 Print 函数的签名以删除 WaitGroup 参数,如下所示:
<code class="go">func Print(ch <-chan int) { for n := range ch { // Read from the channel until it's closed fmt.Println(n) } }</code>
在这种情况下,Print函数负责在完成后关闭 WaitGroup。这种方法更适合外部函数不需要直接访问 WaitGroup 的场景。
以上是为什么将 `sync.WaitGroup` 与外部函数一起使用会导致死锁?的详细内容。更多信息请关注PHP中文网其他相关文章!