2014-10-17 3 views
1

Я использую go 1.3.3. Я пытаюсь понять, когда Go порождает новые потоки. У меня есть следующие две программы Go:OS Threads in a 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() 
} 

В Activity Monitor я вижу, что по программе 1 есть 2 нити и по программе 2 есть 3 потока. У меня есть несколько вопросов:

  1. В программе 1 какие эти 2 темы. Наверное, для «основного», но для чего же другого?
  2. В программе 2, когда я представляю wg.Wait() количество потоков стало 3. Я предсказывал Программе 2 использовать такое же количество потоков, как и Программа 1. Мое понимание заключается в том, что предполагается, что main() работает на поток M1 с контекстом P1. Горотин войдет в стадию P1. Я где-то читал, что все примитивы в пакете синхронизации не заставляют goroutine использовать поток, когда он блокируется из-за них. Если это так, то goroutine должен запускаться одновременно с основным в контексте P1 и на M1, и не должно быть необходимости в новом потоке. Является ли wg.Wait() вызовом блокировки потока?

Любая помощь приветствуется.

+1

В программе 1 другой поток, который вы видите, является, скорее всего, совпадающим сборщиком мусора. – thwd

ответ

1

Правила таковы, что go будет порождать ровно GOMAXPROCS тем для пользовательского уровня код. Из runtime документации:

Переменная GOMAXPROCS ограничивает число потоков операционной системы , которые могут выполняться код Перейти на уровне пользователя одновременно.

Но обратите внимание:

Там нет ограничений на количество потоков, которые могут быть заблокированы в системных вызовов от имени Go кода; те не учитывают лимит GOMAXPROCS .

Остальное зависит от времени выполнения и специфики реализации (и версии). Есть также, вероятно, больше горутов, чем вы можете понять; см. What are the three background goroutines in a Go program?