首页 > 后端开发 > Golang > 正文

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

Linda Hamilton
发布: 2024-11-06 00:50:02
原创
801 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!