缓冲/非缓冲通道

有人可以解释一下,为什么如果通道被缓冲,程序不会以致命错误退出?


无缓冲通道


package main


func main() {

    c := make(chan int)

    c <- 3

}


fatal error: all goroutines are asleep - deadlock!

缓冲通道


package main


func main() {

    c := make(chan int, 1)

    c <- 3

}


[no output]


Program exited.

谢谢!


Qyouu
浏览 195回答 2
2回答

开心每一天1111

如果缓冲区中有空间,则写入缓冲通道不会阻塞。如果您尝试将缓冲区大小为 1 的两个项目放入通道中,则会出现相同的错误:package mainfunc main() {&nbsp; &nbsp; c := make(chan int, 1)&nbsp; &nbsp; c <- 3&nbsp; &nbsp; c <- 4}给你:fatal error: all goroutines are asleep - deadlock!

BIG阳

这是 Go 通道(或其他CSP实现,如 Clojure 的core.async库)的核心概念,它们被阻塞。一般来说,正如您已经提到的,有两种类型的渠道:如果缓冲区已满,则缓冲哪个块。如果没有“集合点”,则无缓冲哪个块,即必须有人将 ( c <-)放入<- c频道,有人从频道中取出 ( )。在您的特定情况下,Go 运行时足够智能,可以检测到没有人会3从 channel 中获取c。因此,这是一个死锁,并且(谢天谢地)抛出了一个错误。当你使用通道时,你通常做的是使用goroutines(查看这个介绍),它产生一个轻量级线程——由 Go 运行时管理——来并发执行主体:c := make(chan int)go func() { c <- 3 }() // Create a new gorountine that puts 3 to the channelfmt.Println(<- c) // Take 3 from the channel and print it in the main thread
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go