Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go程序中的OS线程_Go_Goroutine - Fatal编程技术网

Go程序中的OS线程

Go程序中的OS线程,go,goroutine,Go,Goroutine,我正在使用go 1.3.3。 我试图理解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

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

    规则是go将为用户级代码生成准确的
    GOMAXPROCS
    线程。从文件中:

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

    但请注意:

    中可以阻止的线程数没有限制 代表Go代码的系统调用;这些都不算在预算之内 GOMAXPROCS限制


    其余部分取决于运行时,并且是特定于实现(和版本)的。可能还有比你意识到的更多的goroutine在运行;请参见

    在程序1中,您看到的另一个线程很可能是并发垃圾收集器。