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

无法找到 go 死锁的原因

无法找到 go 死锁的原因

Go
心有法竹 2022-11-23 20:05:14
无法找到此代码死锁的原因。此处的目的是让工作人员仅在收到信号后才执行例行程序。如果从代码中删除 signalStream 通道,它可以正常工作。但是当它被引入时,它就会陷入僵局。不确定这是为什么。另外,如果有任何工具可以解释死锁的发生,那将有所帮助。package mainimport (    "log"    "sync")const jobs = 10const workers = 5var wg sync.WaitGroupfunc main() {    // create channel    dataStream := make(chan interface{})    signalStream := make(chan interface{})    // Generate workers    for i := 1; i <= workers; i++ {        wg.Add(1)        go worker(dataStream, signalStream, i*100)    }    // Generate jobs    for i := 1; i <= jobs; i++ {        dataStream <- i    }    close(dataStream)    // start consuming data    close(signalStream)    wg.Wait()}func worker(c <-chan interface{}, s <-chan interface{}, id int) {    defer wg.Done()    <-s    for i := range c {        log.Printf("routine - %d - %d \n", id, i)    }}
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

在一个单独的 gorouine 中生成作业,即将整个jobs循环放入一个 goroutine 中。如果你不这样做,那么dataStream <- i你的程序将永远不会“开始消耗数据”


// Generate jobs

go func() {

    for i := 1; i <= jobs; i++ {

        dataStream <- i

    }

    close(dataStream)

}()

https://go.dev/play/p/ChlbsJlgwdE


查看完整回答
反对 回复 2022-11-23
  • 1 回答
  • 0 关注
  • 52 浏览
慕课专栏
更多

添加回答

举报

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