go 1.3.3을 사용하고 있습니다. Go가 새로운 스레드를 생성하는시기를 이해하려고합니다. 프로그램 1 프로그램 2 2 개 스레드와이 있다는 것을 내가 보는 활동 모니터에서Go 프로그램의 OS 스레드
package main
import (
"sync"
)
func justrun(wg *sync.WaitGroup) {
for ;; {
}
wg.Done()
}
func main() {
var wg sync.WaitGroup
go justrun(&wg)
wg.Wait()
}
:
프로그램 1 :
package main
func main() {
for ;; {
}
}
프로그램이 나는 다음과 같은 두 가지 바둑 프로그램이 3 개의 스레드가 있습니다. 여러 질문이 있습니다.
- 프로그램 1에서이 두 스레드는 무엇입니까? 하나는 "main"을위한 것이 겠지만 다른 하나는 무엇입니까?
- 프로그램 2에서 wg.Wait()를 소개하면 스레드 수는 3이됩니다. 프로그램 2가 프로그램 1과 동일한 수의 스레드를 사용한다고 예상했습니다. 제 이해는 main()이 실행되고 있다고 가정합니다. 문맥 P1을 가지는 thread M1 goroutine은 P1의 실행 큐에 들어갑니다. 동기화 패키지의 모든 프리미티브가 goroutine이 스레드로 인해 차단 될 때 해당 스레드를 사용하게 만들지 않는다는 것을 알게되었습니다. 이 경우 goroutine은 P1 컨텍스트와 M1에서 main과 동시에 실행해야하며 새 스레드가 필요 없습니다. wg.Wait() 스레드가 호출을 차단합니까?
도움을 주시면 감사하겠습니다.
프로그램 1에서보고있는 다른 스레드는 아마도 동시 가비지 수집기 일 것입니다. – thwd