【发布时间】:2019-10-31 16:59:05
【问题描述】:
所以我有一个程序需要分配一大块内存并永久保存。作为测试,我还运行了一个运行无限循环的 goroutine,在我的主线程中,我分配了内存,但是即使我将 GOMAXPROCS 设置为大于 1,程序也会永远卡在 goroutine 的无限循环中。
func main() {
runtime.GOMAXPROCS(2)
go func() {
for {
//fmt.Printf("goroutine1\n")
}
}()
fmt.Println("main thread1")
x := [1145][1145]int{}
for i := 0; i < 1144; i++ {
fmt.Println(i)
x[i][i] = i
}
fmt.Println("main thread2")
}
如果我在无限循环中不做任何事情,我的主线程 1 将永远无法成功分配内存并打印“主线程 2”,即使我将 GOMAXPROCS 设置为 2,如果我在无限循环中打印一些东西,一切正常(这是预期的,因为 goroutine 在无限循环中打印一些东西,它调用系统调用并产生 cpu,所以我的主线程可以分配内存。
我想知道这是为什么?
【问题讨论】:
-
这样的紧密循环不会给调度程序运行的机会。基本上......永远不要像这样运行一个紧密的循环。
-
繁忙的循环始终是编程错误。您的代码中没有理由这样做。
-
但没有将 GOMAXPROCS 设置为超过 1 意味着我可以拥有超过 1 个核心并且我的主线程也将有机会运行?
-
你的主 goroutine 确实有机会运行,直到运行时期望中断繁忙循环并被阻塞。