为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我会出现内存泄漏?

为什么我会出现内存泄漏?

Go
鸿蒙传说 2021-12-20 10:16:48
我有以下内容:http : //play.golang.org/p/1aaive8KQx当我打印 runtime.NumGoroutine() 时,我得到 3。我不应该只得到 1 吗?为什么?package mainimport (    "log"    "runtime"    "time")func main() {    for i := 1; i <= 10; i++ {        ch := make(chan int, 10)        timeout := time.Tick(1 * time.Second)        for i := 1; i <= 10; i++ {            go func(i int) {                time.Sleep(2 * time.Second)                ch <- i            }(i)        }        for i := 1; i <= 10; i++ {            select {            case j := <-ch:                log.Println(j)            case <-timeout:                log.Println("timeout")            }        }        log.Println("Processes", runtime.NumGoroutine())    }}
查看完整描述

1 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

有一个奇怪的竞争条件。基本上发生的事情是当你调用Println一些 goroutines 仍在运行但很快就会终止。先睡一觉Println,你就会得到1 Processes。如果您阅读日志,您将看到 2 个超时 - 这意味着您在循环中跳过了 2 个通道读取。不知何故,它让您的主协程有时间从通道读取 8 个值并Println在 2 个协程终止之前调用。这是一种竞争条件,因此很难准确描述发生了什么。除了您的代码之外,调度程序和通道的实现在这里也很重要。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号