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

无法找到 go 死锁的原因

无法找到 go 死锁的原因

Go
心有法竹 2022-11-23 20:05:14

无法找到此代码死锁的原因。此处的目的是让工作人员仅在收到信号后才执行例行程序。


如果从代码中删除 signalStream 通道,它可以正常工作。但是当它被引入时,它就会陷入僵局。不确定这是为什么。另外,如果有任何工具可以解释死锁的发生,那将有所帮助。


package main


import (

    "log"

    "sync"

)


const jobs = 10

const workers = 5


var wg sync.WaitGroup


func 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贡献1514条经验 获得超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

添加回答

举报

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