首页  >  文章  >  后端开发  >  为什么将 `sync.WaitGroup` 与外部函数一起使用会导致死锁?

为什么将 `sync.WaitGroup` 与外部函数一起使用会导致死锁?

Linda Hamilton
Linda Hamilton原创
2024-11-06 00:50:02786浏览

Why does using `sync.WaitGroup` with external functions lead to a deadlock?

使用带有外部函数的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中文网其他相关文章!

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