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

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

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

Go
白猪掌柜的 2021-08-16 19:33:13
这更像是另一个帖子的后续问题我不明白为什么添加第二个通道(在我的例子中是 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)}
查看完整描述

2 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

声明

c2 := make(chan int)
c2 <- 1

会一直阻塞。

因为通道c2是无缓冲的,所以在另一个 goroutine 从通道接收到值之前,发送操作无法继续。没有可以从通道接收的 goroutine,因此发送永远阻塞。

Effective Go 中的频道部分是阅读无缓冲频道的好地方。另请参阅Go 语言规范中有关通道和发送的部分。

如果您创建c2一个缓冲通道,该程序将按我认为的那样工作:

    c2 := make(chan int, 1)

通过此更改,发送可以在不与接收器同步的情况下继续进行。


查看完整回答
反对 回复 2021-08-16
?
米琪卡哇伊

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

Go 编程语言规范

发送语句

通信阻塞,直到发送可以继续。如果接收器准备好,则可以继续在无缓冲通道上发送。

没有接收器准备好。

package main
func main() {
    c2 := make(chan int)
    c2 <- 1}

输出:

fatal error: all goroutines are asleep - deadlock!


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 202 浏览
慕课专栏
更多

添加回答

举报

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