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

当我在 goroutine 中添加 select default 语句时通道死锁

当我在 goroutine 中添加 select default 语句时通道死锁

Go
泛舟湖上清波郎朗 2023-03-15 14:50:39
我正在学习频道,下面是我尝试过的测试,但发生了死锁func main() {    ch := make(chan int)    go func() {        select {        case ch <- 1:            fmt.Println("send suc")        default: // if comment this line, it will run smoothly            fmt.Println("default")        }    }()    time.Sleep(2) // do some time consuming thing...    fmt.Printf("receive val: %d", <-ch)}我预计没有死锁,但结果是:defaultfatal error: all goroutines are asleep - deadlock!但是如果我删除defaultor time.Sleep(2),代码将顺利运行,结果:send sucreceive val: 1有人可以解释为什么会发生死锁吗?
查看完整描述

1 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

你有一个selectwith default,这意味着如果没有任何通信操作准备就绪,则select 不会等待,不会阻塞,而是default立即执行。通道是无缓冲的,所以它上面的发送还没有准备好(因为没有准备好的接收器——main正在休眠)。

因此,一旦 sleep 结束main,它就会尝试从通道接收,但到那时没有人尝试发送。僵局。


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

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