登录
首页 >  Golang >  Go问答

避免Go通道发生死锁

来源:stackoverflow

时间:2024-03-11 11:00:29 425浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《避免Go通道发生死锁》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

package main
import (
    "fmt"
    "time"
)

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

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

    time.Sleep(2 * time.Second)
}

在上面的程序中,我创建了一个正在写入通道 c 的 go 例程,但没有其他 go 例程从该通道读取。为什么在这种情况下没有出现僵局?


解决方案


死锁意味着所有 goroutine 都被阻塞,而不仅仅是您选择的任意一个 goroutine。

main goroutine 只是处于睡眠状态,一旦睡眠结束,它就可以继续运行。

如果您使用 select{} 永久阻塞操作来切换 sleep,则会出现死锁:

c := make(chan int)

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

select {}

Go Playground 上尝试一下。

查看相关:Why there is no error that receiver is blocked?

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《避免Go通道发生死锁》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>