2014-10-17 3 views
1

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. 프로그램 1에서이 두 스레드는 무엇입니까? 하나는 "main"을위한 것이 겠지만 다른 하나는 무엇입니까?
  2. 프로그램 2에서 wg.Wait()를 소개하면 스레드 수는 3이됩니다. 프로그램 2가 프로그램 1과 동일한 수의 스레드를 사용한다고 예상했습니다. 제 이해는 main()이 실행되고 있다고 가정합니다. 문맥 P1을 가지는 thread M1 goroutine은 P1의 실행 큐에 들어갑니다. 동기화 패키지의 모든 프리미티브가 goroutine이 스레드로 인해 차단 될 때 해당 스레드를 사용하게 만들지 않는다는 것을 알게되었습니다. 이 경우 goroutine은 P1 컨텍스트와 M1에서 main과 동시에 실행해야하며 새 스레드가 필요 없습니다. wg.Wait() 스레드가 호출을 차단합니까?

도움을 주시면 감사하겠습니다.

+1

프로그램 1에서보고있는 다른 스레드는 아마도 동시 가비지 수집기 일 것입니다. – thwd

답변

1

규칙은 GOMAXPROCS 스레드가 사용자 레벨 코드로 정확히 생성됩니다. runtime 문서에서 :

GOMAXPROCS 변수는 동시에 사용자 수준의 이동 코드를 실행할 수있는 운영 체제 스레드 의 수를 제한합니다.

그러나 참고 : 시스템에서 이동 코드를 대신 호출 차단 될 수있는 스레드의 수에는 제한이 없습니다

; 그것들은 GOMAXPROCS 한도에 포함되지 않습니다.

나머지는 런타임까지이며 구현 (및 버전)에 따라 다릅니다. 또한 아마도 당신보다 더 많은 goroutine이 실행될 수 있습니다. What are the three background goroutines in a Go program?

관련 문제