为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的golang goroutine代码陷入僵局

为什么我的golang goroutine代码陷入僵局

Go
哆啦的时光机 2022-09-05 15:50:54
我试图用通道写一些goroutine,但陷入了僵局,为什么?我是不是跟WaitGroup做错了,太糊涂了...package mainimport (    "fmt"    "sync")var wg sync.WaitGroupfunc 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只是不让我提交问题.......所以我只需要添加一些文本.....
查看完整描述

2 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

主块 on ,等待这两个 go 例程完成(因为 和wg.Wait()wg.Add(1)wg.Done())


go makeChanStr("yeye", chan1, chan3)

go makeChanStr("okok", chan2, chan3)

但是它们阻塞(或),因为它是一个无缓冲信道。chan1chan2


chan1 := make(chan string)

尝试更改 和 缓冲通道:chan1chan2


chan1 := make(chan string,1)

chan2 := make(chan string,1)


查看完整回答
反对 回复 2022-09-05
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

此代码在主 goroutine 中阻止,并在 worker 中写入。为了避免这种情况 - 从和之前读取,从而取消阻止工作线程,并且他们不会阻止写入缓冲。因此,将调用并且不会阻止主goroutine。wg.Wait()c1c1c2wg.Wait()c3wg.Done()wg.Wait()


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)

    println(<-chan1)

    println(<-chan2)

    wg.Wait()

    close(chan3)

    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 %s\n", s)

}


查看完整回答
反对 回复 2022-09-05
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信