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

缓冲/非缓冲通道

缓冲/非缓冲通道

Go
Qyouu 2021-06-23 17:13:06
有人可以解释一下,为什么如果通道被缓冲,程序不会以致命错误退出?无缓冲通道package mainfunc main() {    c := make(chan int)    c <- 3}fatal error: all goroutines are asleep - deadlock!缓冲通道package mainfunc main() {    c := make(chan int, 1)    c <- 3}[no output]Program exited.谢谢!
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

如果缓冲区中有空间,则写入缓冲通道不会阻塞。


如果您尝试将缓冲区大小为 1 的两个项目放入通道中,则会出现相同的错误:


package main


func main() {

    c := make(chan int, 1)

    c <- 3

    c <- 4

}

给你:


fatal error: all goroutines are asleep - deadlock!


查看完整回答
反对 回复 2021-07-19
?
BIG阳

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

这是 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 channel


fmt.Println(<- c) // Take 3 from the channel and print it in the main thread


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

添加回答

举报

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