Goroutine 是否与其通道一起被垃圾收集?

2023-12-21

想象一下下面的代码:

func waitForOneOfTwoProcesses() {

    c := make(chan bool)
    go func() {
        time.Sleep(1 * time.Second)
        c<-true
    }()
    go func() {
        time.Sleep(2 * time.Second)
        c<-true
    }()
    <-c

}

这是否泄漏了通道和 goroutine,或者 Go 是否识别到了c消失了,goroutine 可以退出吗?

如果通道的缓冲区大小为 2,答案会有所不同吗?


如果通道未缓冲,则匿名函数之一将不会返回。该程序泄漏了 goroutine 和通道。

如果通道的缓冲区大小大于或等于 1,则两个匿名函数都将返回。 Goroutines 和 Channel 使用的资源将被回收。

缓冲区大小为 1 足以防止泄漏。功能waitForOneOfTwoProcesses接收发送到的值之一c。第二个值发送到c缓冲在通道中(由GC收集)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Goroutine 是否与其通道一起被垃圾收集? 的相关文章

随机推荐