首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >go语言fatal error: all goroutines are asleep - deadlock!

go语言fatal error: all goroutines are asleep - deadlock!

作者头像
仙士可
发布2022-01-14 16:04:50
发布2022-01-14 16:04:50
1.9K0
举报
文章被收录于专栏:仙士可博客仙士可博客

在默认情况下,go 通信是同步并且无缓冲的,而channel必须一边发送和接收端都准备才可以进行收发,否则就会进行死锁:

产生死锁的原因是:

通道ch写入1,这个时候是同步等待接收端接收的状态,而接收的代码却在下一行,这个时候就导致了整个程序无法往下执行,造成死锁

同样:如果先接收数据,而这个时候通道是没有发送端的,同样将造成死锁

解决方案

方案1 通过 起一个协程,可使得接收端和发送端并行执行:

代码语言:javascript
复制
package main

func main() {
   ch := make(chan int)
   go func() {
      //time.Sleep(100000000)
      ch<-1
   }()
   println(<-ch)
}

通过执行一个协程匿名函数,使得发送通道和接收通道同时执行

如果开启time.sleep()呢?

这个时候,main主线程将会阻塞一秒,等待go匿名函数的发送端发送数据,不会形成死锁

方案2 给channel增加缓冲区

make的第二个参数可给channel增加缓冲区

代码语言:javascript
复制
package main

func main() {
   ch := make(chan int,1)
   ch<-1
   println(<-ch)
}

channel 通道增加缓存区后,可将数据暂存到缓冲区,而不需要接收端同时接收 (缓冲区如果超出大小同样会造成死锁)

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
    • 方案1 通过 起一个协程,可使得接收端和发送端并行执行:
    • 方案2 给channel增加缓冲区
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档