【发布时间】:2021-12-14 15:08:13
【问题描述】:
在主 goroutine 中,如果我向通道发送超出容量的值,我会遇到死锁,但如果我在不同的 goroutine 中发送,不会出现死锁,为什么?
func main() {
c := make(chan int, 2)
for i := 0; i < 3; i++ {
c <- i
}
}
func main() {
c := make(chan int, 2)
go func() {
for i := 0; i < 3; i++ {
c <- i
}
close(c)
}()
time.Sleep(5 * time.Second)
}
【问题讨论】:
-
在第一种情况下,没有 goroutines 可以继续。在第二种情况下,当新的 goroutine 被阻塞等待写入通道时,主 goroutine 仍然可以继续。
-
"如果我向通道发送的值超出了容量" --- 你还期望在那里看到什么?
-
@BurakSerdar 一个goroutine不会知道外面是否还有其他channel操作,所以第二种情况,从goroutine的角度来看是可以继续的,对吗?
-
@zerkms 我想我也会陷入僵局,以防万一 2
-
不是 goroutine,但运行时知道是否还有其他可运行的 goroutine。在第二种情况下,主 goroutine 永远不会被阻塞。
标签: go