【问题标题】:Goroutine storage channel value has no deadlockGoroutine 存储通道值没有死锁
【发布时间】:2019-03-15 03:11:54
【问题描述】:

此代码运行并以没有死锁错误结束。为什么?

func main() {
    ch := make(chan int)
    go func() {
        ch<-1
        ch<-2
    }()

    time.Sleep(time.Second)
}

【问题讨论】:

  • gorountne 被永久阻塞,但是当 main 返回时应用程序退出。
  • 什么是“Goroutine 存储通道”?

标签: go


【解决方案1】:

无缓冲通道需要两个端点才能工作,所以让我们从正确的例子开始:

package main

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

var ch = make(chan int)

这里fun2() 发送两个值,main() 接收两个值。


您的示例代码只有一个端点,因此通道构造不正确,因此是死锁,但main goroutines 正常退出,因此您看不到错误。这里没有第二个端点,所以这是死锁:

package main

func main() {
    var ch = make(chan int)
    ch <- 1
}

输出:

fatal error: all goroutines are asleep - deadlock!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-06
    • 2021-09-11
    • 2017-02-23
    • 2018-09-20
    相关资源
    最近更新 更多