【问题标题】:OS Threads in a Go ProgramGo 程序中的操作系统线程
【发布时间】: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. 在程序 1 中,这 2 个线程是什么。我猜一个是“主要”,但另一个是什么?
  2. 在程序 2 中,一旦我引入 wg.Wait(),线程数变为 3。我预测程序 2 将使用与程序 1 相同数量的线程。我的理解是假设 main() 正在运行具有上下文 P1 的线程 M1。 goroutine 将进入 P1 的运行队列。 我在某处读到,同步包中的所有原语都不会导致 goroutine 在因为它们而被阻塞时使用线程。如果是这种情况,那么 goroutine 应该在 P1 上下文和 M1 上与 main 并发运行,并且不需要新线程。 wg.Wait() 是线程阻塞调用吗?

感谢任何帮助。

【问题讨论】:

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

标签: go goroutine


【解决方案1】:

规则是,go 将为 user-level 代码准确生成 GOMAXPROCS 线程。来自runtime 文档:

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

但请注意:

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

其余的取决于运行时,并且是特定于实现(和版本)的。运行的 goroutine 可能比你想象的要多;见What are the three background goroutines in a Go program?

【讨论】:

    猜你喜欢
    • 2011-05-24
    • 2020-02-20
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    相关资源
    最近更新 更多