Go程序中的OS线程

时间:2014-10-17 11:38:39

标签: go goroutine

我正在使用1.3.3。 我试图理解Go何时产生新线程。我有以下两个Go程序:

计划1:

package main

func main() {
     for ;; {
     }
}

计划2:

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. 在程序1中,这2个线程是什么。我猜一个是“主”,但另一个是什么?
  2. 在程序2中,一旦我引入了wg.Wait(),线程数变为3.我预测程序2使用与程序1相同数量的线程。我的理解是假设main()正在运行带有上下文P1的线程M1。 goroutine将进入P1的队列。 我在某处读到同步包中的所有原语都不会导致goroutine因为它们而被阻塞时使用它。如果是这种情况,那么goroutine应该在P1上下文和M1上与main同时运行,并且不需要新的线程。 wg.Wait()是一个阻塞调用的线程吗?
  3. 感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

规则是go将为用户级代码准确生成GOMAXPROCS个线程。来自runtime文档:

  

GOMAXPROCS变量限制操作系统线程的数量   可以同时执行用户级Go代码。

但请注意:

  

可以阻止的线程数没有限制   系统调用代表Go代码;那些不算数   GOMAXPROCS限制。

其余部分取决于运行时,并且是特定于实现(和版本)的。还有比你可能意识到的更多的goroutines运行;见What are the three background goroutines in a Go program?