返回顶部
首页 > 资讯 > 精选 >这里可能会出现恐慌吗?
  • 190
分享到

这里可能会出现恐慌吗?

排列 2024-02-05 22:02:10 190人浏览 独家记忆
摘要

问题内容 func main() { rand.Seed(time.Now().Unix()) ctx, cancelFunc := context.WithCance

问题内容

func main() {
    rand.Seed(time.Now().Unix())
    ctx, cancelFunc := context.WithCancel(context.Background())
    anies := make(chan any)
    Go doSomething(ctx, anies)
    intn := rand.Intn(2)
    if intn == 0 { //BRANCH1
        cancelFunc()
        close(anies) 
    }
    time.Sleep(time.Second)
}

func doSomething(ctx context.Context, anies chan any) {
    for {
         if ctx.Err() == nil { //LINE2
            anies <- 1 //LINE3
        }
    }
}

有没有可能,当 branch1 发生在 line2 和 line3 之间时,我会感到恐慌。


正确答案


是的,恐慌是可能的。以下是发生恐慌的时间线示例。这些行按时间递增顺序排列。 N: 前缀代表 goroutine。

1:启动协程2
2:调用ctx.Err(),它返回nil
1:调用cancelFunc()
1:关闭通道anis
2:发送到aniy频道。恐慌,因为通道已关闭。

以上就是这里可能会出现恐慌吗?的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 这里可能会出现恐慌吗?

本文链接: https://lsjlt.com/news/561067.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作