登录
首页 >  Golang >  Go问答

为什么我的 golang goroutine 陷入无法正常继续执行的状态

来源:stackoverflow

时间:2024-02-17 13:57:25 430浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《为什么我的 golang goroutine 陷入无法正常继续执行的状态》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我尝试用通道编写一些goroutine,但陷入僵局,为什么? 我对 waitgroup 做错了吗,很困惑......

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func main() {
    chan1 := make(chan string)
    chan2 := make(chan string)
    chan3 := make(chan string, 2)
    wg.Add(1)
    go makeChanStr("yeye", chan1, chan3)
    wg.Add(1)
    go makeChanStr("okok", chan2, chan3)
    wg.Wait()
    close(chan3)
    println(<-chan1)
    println(<-chan2)
    for chs := range chan3 {
         println(chs)
    }
}

func makeChanStr(s string, c1 chan string, c2 chan string) {
    defer wg.Done()

    c1 <- "get " + s
    c2 <- "same value"
    fmt.Printf("execute ok %s", s)
}

stackoverflow 只是不让我提交问题......所以我只需要添加一些文本......


正确答案


wg.wait() 上的主块,等待这两个 go 例程完成(因为 wg.add(1)wg.done())

go makechanstr("yeye", chan1, chan3)
go makechanstr("okok", chan2, chan3)

但它们会阻止 chan1 (或 chan2),因为它是一个无缓冲通道。

chan1 := make(chan string)

尝试更改 chan1chan2 来缓冲通道:

chan1 := make(chan string,1)
chan2 := make(chan string,1)

好了,本文到此结束,带大家了解了《为什么我的 golang goroutine 陷入无法正常继续执行的状态》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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