即使独立,第二个通道也会导致死锁

这更像是另一个帖子的后续问题

我不明白为什么添加第二个通道(在我的例子中是 c2)会导致死锁。通道是独立的,我不明白为什么 c2 应该被阻止

func do_stuff(done chan bool) {

    fmt.Println("Doing stuff")

    done <- true

}


func main() {

    fmt.Println("Main")

    done := make(chan bool)

    go do_stuff(done)

    <-done

    //Up tp here everything works

    c2 := make(chan int)

    c2 <- 1

    fmt.Println("Exit ",<-c2)


}


白猪掌柜的
浏览 203回答 2
2回答

倚天杖

声明c2&nbsp;:=&nbsp;make(chan&nbsp;int) c2&nbsp;<-&nbsp;1会一直阻塞。因为通道c2是无缓冲的,所以在另一个 goroutine 从通道接收到值之前,发送操作无法继续。没有可以从通道接收的 goroutine,因此发送永远阻塞。Effective Go 中的频道部分是阅读无缓冲频道的好地方。另请参阅Go 语言规范中有关通道和发送的部分。如果您创建c2一个缓冲通道,该程序将按我认为的那样工作:&nbsp;&nbsp;&nbsp;&nbsp;c2&nbsp;:=&nbsp;make(chan&nbsp;int,&nbsp;1)通过此更改,发送可以在不与接收器同步的情况下继续进行。

米琪卡哇伊

Go 编程语言规范发送语句通信阻塞,直到发送可以继续。如果接收器准备好,则可以继续在无缓冲通道上发送。没有接收器准备好。package&nbsp;main func&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;c2&nbsp;:=&nbsp;make(chan&nbsp;int) &nbsp;&nbsp;&nbsp;&nbsp;c2&nbsp;<-&nbsp;1}输出:fatal&nbsp;error:&nbsp;all&nbsp;goroutines&nbsp;are&nbsp;asleep&nbsp;-&nbsp;deadlock!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go