【发布时间】:2014-10-17 22:43:21
【问题描述】:
我正在使用 go 1.3.3。 我试图了解 Go 何时产生新线程。我有以下两个 Go 程序:
方案一:
package main
func main() {
for ;; {
}
}
方案二:
package main
import (
"sync"
)
func justrun(wg *sync.WaitGroup) {
for ;; {
}
wg.Done()
}
func main() {
var wg sync.WaitGroup
go justrun(&wg)
wg.Wait()
}
在活动监视器中,我看到程序 1 有 2 个线程,程序 2 有 3 个线程。我有多个问题:
- 在程序 1 中,这 2 个线程是什么。我猜一个是“主要”,但另一个是什么?
- 在程序 2 中,一旦我引入 wg.Wait(),线程数变为 3。我预测程序 2 将使用与程序 1 相同数量的线程。我的理解是假设 main() 正在运行具有上下文 P1 的线程 M1。 goroutine 将进入 P1 的运行队列。 我在某处读到,同步包中的所有原语都不会导致 goroutine 在因为它们而被阻塞时使用线程。如果是这种情况,那么 goroutine 应该在 P1 上下文和 M1 上与 main 并发运行,并且不需要新线程。 wg.Wait() 是线程阻塞调用吗?
感谢任何帮助。
【问题讨论】:
-
在程序 1 中,您看到的另一个线程很可能是并发垃圾收集器。