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