登录
首页 >  Golang >  Go问答

同步功能在Go WorkGroup上的问题

来源:stackoverflow

时间:2024-02-10 19:24:24 168浏览 收藏

今天golang学习网给大家带来了《同步功能在Go WorkGroup上的问题》,其中涉及到的知识点包括等等,无论你是小白还是老手,都适合看一看哦~有好的建议也欢迎大家在评论留言,若是看完有所收获,也希望大家能多多点赞支持呀!一起加油学习~

问题内容

这只是一个抽象的例子。只要 test 收到来自 test2 的消息,它就会工作。然后,当它们全部完成时, wg.done() 将被调用,应用程序将在 wg.wait() 之后关闭。

package main

import (
    "fmt"
    "sync"
)

var a = make(chan bool)
var wg sync.WaitGroup

func main() {
    go test()
    wg.Add(1)
    for i := 0; i < 5; i++ {
        go test2()
        wg.Add(1)
    }
    wg.Wait()
}

func test() {
    defer wg.Done()
    for {
        val := <-a
        fmt.Println(val)
    }
}

func test2() {
    defer wg.Done()
    for i := 0; i < 3; i++ {
        a <- true
    }
}

至少这是理论,但它并不能很好地转化为实践。它正确显示 true 15 次,但随后应用程序因死锁而崩溃,因为 wg.done() 从未被调用。我很困惑,因为这就是教程中的做法。


正确答案


test 中创建的 goroutine 永远不会终止,因此,等待组计数永远不会达到零,并且会无限期地等待。

在 3 次写入后终止无限的 for 循环,程序应该可以工作,因为您正在从通道读取 3 次。

此外,您必须在创建 goroutine 之前调用 wg.Add,而不是之后。 wg.Done 可能会在您添加之前被调用,从而导致恐慌。

本篇关于《同步功能在Go WorkGroup上的问题》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>