栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在同一goroutine中使用未缓冲的通道会导致死锁?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在同一goroutine中使用未缓冲的通道会导致死锁?

从文档中:

如果通道未缓冲,则发送方将阻塞,直到接收方收到该值为止。如果通道具有缓冲区,则发送方仅阻塞该值,直到将值复制到该缓冲区为止;否则,发送方才阻塞。如果缓冲区已满,则意味着要等到某些接收器检索到一个值。

否则说:

  • 当频道已满时,发送方等待另一个goroutine通过接收来腾出空间
  • 您会看到一个未缓冲的通道总是一个完整的通道:必须有另一个goroutine来处理发送方发送的内容。

这条线

c <- 1

阻塞,因为通道没有缓冲。由于没有其他goroutine可以接收该值,因此情况无法解决,这是一个僵局。

您可以将频道创建更改为

c := make(chan int, 1)

这样,频道在被阻止之前就可以容纳一个项目。

但这不是并发的意义所在。通常,没有其他goroutine不会使用通道来处理放入内部的内容。您可以这样定义一个接收goroutine:

func main() {    c := make(chan int)        go func() {        fmt.Println("received:", <-c)    }()    c <- 1   }

示范



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426753.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号