2011-02-13 3 views
0

나는 간단한 윈도우 콘솔 응용 프로그램을 실행하고 있습니다 : - :왜 프로세스가 시작될 때 추가 작업자 스레드가 생성됩니까?

__

5840 0 Main Thread Main Thread Normal 


console.exe!wmain(int argc=1, wchar_t * * argv=0x006831a0) 

console.exe!__tmainCRTStartup() 

console.exe!wmainCRTStartup() 

[email protected]@12() 

[email protected]() 

[email protected]() 

제어 메인에 올 때 은 내가 stack--

_ 내 메인 스레드의 스택을 덤프 위의 경우 시작시 왜 이것을 볼 수 있습니까? :

3740 0 Worker Thread Win32 Thread Normal 

스택 :

[email protected]() 
[email protected]() 
[email protected]() 
[email protected]() 
+0

런타임 라이브러리 또는 Windows의 일부가 다른 스레드를 생성합니다. 그게 왜 너를 괴롭히는거야? –

+0

어디서나 문서화되어 있습니까? .. 그래서 프로세스를 만들 때마다 실제로 2 개의 스레드가 만들어 집니까? 다른 스레드는 무엇을합니까? – agua

+0

"애처로운 공동체"? 그게 무슨 뜻 이죠? –

답변

1

LdrInitializeThunk는 설정에 대한 방법 새 스레드입니다. VS2008 일반 Win32 콘솔 응용 프로그램 (MFC, ATL 없음) 만들고 하나의 스레드를 얻을 않았다. 디버거를 연결할 때만 디버거가 프로세스 디버깅을 가능하게하는 스레드를 주입하기 때문에 두 번째 프로세스를 얻습니다. 프로세스 시작은 here 책에서 자세히 설명합니다. 여기서 두 번째 스레드가 필요하다는 언급은 없습니다. 비동기 프로 시저 호출 APCs도 책임이 없습니다. 어쩌면 호출 스택이 모든 심볼이로드되지 않고 생성되었고 디버거 도우미 쓰레드가 애플리케이션 내부의 숨겨진 쓰레드로 의심 될 수도 있습니다. 디버거없이 프로세스 탐색기로 프로세스를 살펴볼 때 하나의 스레드 만 표시됩니다.

6 단계 : 수행을 처리 새로운 프로세스 KeInitializeThread에 의해 호출 입니다

KiInitializeContextThread,의 맥락에서 초기화 스레드와 스레드의 커널 스택의 초기 컨텍스트를 구축합니다. 새 스레드가 커널 모드 스레드 시작 루틴 KiThreadStartup 실행을 시작합니다. ( 단계는이 이어지는 스레드 시작에 대한 자세한 설명은 섹션 페이지의 "CreateThread의 흐름을.")를 KiThreadStartup 루틴이 다음 단계를 수행합니다

  1. 가에서 IRQL 수준을 낮 춥니을 DPC/디스패치 수준을 APC (비동기 프로 시저 호출) 수준으로 설정합니다.

  2. 작업 집합 확장을 사용합니다.

  3. 사용자 모드 APC를 사용자 모드 스레드 시작 루틴 Ntdll.dll 내의 LdrInitializeThunk를 실행하기 위해 큐에 대기시킵니다.

관련 문제