go - 转到 channel 死锁未发生

标签 go goroutine

package main
import (
    "fmt"
    "time"
)

func main() {
    c := make(chan int)

    go func() {
        fmt.Println("hello")
        c <- 10
    }()

    time.Sleep(2 * time.Second)
}

在以上程序中,我创建了一个Go例程,该例程正在写入 channel c,但是没有其他go例程正在从该 channel 读取。为什么在这种情况下没有僵局?

最佳答案

死锁意味着所有goroutine被阻止,而不仅仅是您选择的任意goroutine。
main goroutine只是处于 sleep 状态,一旦结束,它便可以继续运行。

如果使用永久阻止sleep的方式切换select{},则会出现死锁:

c := make(chan int)

go func() {
    fmt.Println("hello")
    c <- 10
}()

select {}

Go Playground上尝试一下。

参见相关:Why there is no error that receiver is blocked?

关于go - 转到 channel 死锁未发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61655436/

相关文章:

go - 这是 goroutine 开销的一个更好的代码

go - 为什么这个 go 例程在关闭阻塞读取连接时随机无法退出?

go - 超时同时等待两个结果

go - 语法错误 : unexpected name, 需要分号或换行符或 }

node.js - 等价于Golang中的readUIntLE?

go - 如何确定变量是 slice 还是数组?

go - Pkcs11 ECDSA 签名返回 CKR_DATA_INVALID

几分钟后,Go 爬虫在从输出 channel 中选择时停止

具有多种类型的协程和 channel

go - 这台机器上最有效的 goroutines 数量