gpt4 book ai didi

go - 为什么这个 golang 程序会造成内存泄漏?

转载 作者:IT王子 更新时间:2023-10-29 02:03:33 25 4
gpt4 key购买 nike

我正在尝试了解并发和 goroutines,并对以下实验代码有几个问题:

  1. 为什么会造成内存泄漏?我认为在 goroutine 结束时返回会允许清理与其关联的内存。
  2. 为什么我的循环几乎从不达到 999?事实上,当我输出到文件并研究输出时,我注意到它很少打印两位数的整数;它第一次打印“99”是第 2461 行,“999”是第 6120 行。这种行为出乎我的意料,这显然意味着我并不真正了解 goroutine 调度是怎么回事。

免责声明:

请小心运行下面的代码,如果您在几秒钟后不停止它,它可能会使您的系统崩溃!

代码

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup
for {
// spawn four worker goroutines
spawnWorkers(4, wg)
// wait for the workers to finish
wg.Wait()
}
}

func spawnWorkers(max int, wg sync.WaitGroup) {
for n := 0; n < max; n++ {
wg.Add(1)
go func() {
defer wg.Done()
f(n)
return
}()
}
}

func f(n int) {
for i := 0; i < 1000; i++ {
fmt.Println(n, ":", i)
}
}

最佳答案

感谢 Tim Cooper、JimB 和 Greg 提供的有益评论。更正后的代码版本发布在下方以供引用。

这两个修复是通过引用传递WaitGroup,修复了内存泄漏,并将n正确传递给匿名goroutine,以及

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup
for {
// spawn four worker goroutines
spawnWorkers(4,&wg)
// wait for the workers to finish
wg.Wait()
}
}

func spawnWorkers(max int, wg *sync.WaitGroup) {
for n := 0; n < max; n++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
f(n)
return
}(n)
}
}

func f(n int) {
for i := 0; i < 1000; i++ {
fmt.Println(n, ":", i)
}
}

关于go - 为什么这个 golang 程序会造成内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com