【问题标题】:Goroutine buffered channel deadlockGoroutine 缓冲通道死锁
【发布时间】: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


【解决方案1】:
func main() {
   c := make(chan int, 2)
   for i := 0; i < 3; i++ {
       // Blocking operation
       c <- i
   }
}
By default >>>sends<<< and receives block(!) until both the sender and receiver are ready

结帐 - https://gobyexample.com/channels

您的频道上没有接收者,主 goroutine(= 发送者)被阻止

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 2021-12-25
    • 2021-08-15
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 2014-05-26
    • 2019-04-08
    相关资源
    最近更新 更多