协程写入无缓冲 channel 为什么不会出现死锁

func main() {

    ch := make(chan int)

    go func() {
        ch <- 1
        ch <- 2
    }()

    time.Sleep(time.Second)
}
讨论数量: 5

应该是goroutine死锁了,但main退出了,所以goroutine也退出了,
如果写在main中就死锁了,

    ch := make(chan int)
    go func() {
        ch <- 1
        ch <- 2
    }()
    ch <- 2
    time.Sleep(time.Second)

或者你在goroutine中println,打印不出,说明其内部也是死锁的

   ch := make(chan int)
    go func() {
        ch <- 1
        ch <- 2
        println("11111")
    }()
    time.Sleep(time.Second)
2个月前 评论

上面代码goroutine 内部阻塞了,但是主goroutine没有阻塞所以没死锁。所有用户级goroutine阻塞才会死锁。
阻塞是死锁的必要条件,但不充分。

2个月前 评论
yourself

@wish 查了一下资料基本是这个意思,因为channel只有一端,所以没有正确执行,main退出后goroutines也退出了,所以没有显示出deadlock

func main() {
    ch := make(chan int)
    go func() {
        ch <- 1
        ch <- 2
    }()
    ch <- 2
    time.Sleep(time.Second)
}
// fatal error: all goroutines are asleep - deadlock!
2个月前 评论

@yourself 是的,死锁,是指在程序的主线程中发生的情况,如果情况发生在非主线程中,读取或者写入的情况是发生堵塞的,而不是死锁。实际上,阻塞情况省去了我们加锁的步骤,反而是更加有利于代码编写,要合理的利用阻塞。
参见:https://blog.csdn.net/qq_30505673/article/...

2个月前 评论
yourself

@wish 感谢分享

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

社区文档:

短小精湛的 Golang 入门教程,是 The Little Go Book 的中文翻译
Github 上《The Way to Go》中文译本的镜像,优化了排版
@无闻 出品的一套面向新手级别学习者 Go 语言的视频教程
一步步带你进入 Go Web 编程的世界,让我们开始探索吧!
号称宇宙最快的 Iris Web 框架的中文文档翻译
Gin 是一个用 Go 语言编写的 WEB 框架,本文档为其中文版本
GORM 是优秀的 Golang ORM 类库,本文档是其官方文档的中文翻译,每年更新