threadex.c 파일에 정의된 _beginthreadex 는 다음과 같다.


사용자 삽입 이미지


 

1 . 윈도우에서 _beginthreadex를 실행하면 tiddata 구조체를 할당받고 구조체에 정보를 채운

 

  다

 

2. CreateThread 인자로 넘긴다(CreateThread 실행하는 이유는 윈도우 OS에서 스레드를 생

 

  성을 알수있는 방법은 CreateThread를 호출하는것 뿐이다.)

 

3. Kernel32.dll안에 존재하는 BaseThreadStart함수를 실행한다. 내부에서 _threadstartex

 

가   실행된다.

 

_threadstartex 함수는 다음과 같다.

 

 

사용자 삽입 이미지

 

 4. threadstartex 함수 내부에 tiddata블록과 스레드를 연결해준다. 그 후 C/C++ 런타임

 

라이브러리 시그널 함수를 다룬다.(CreateThread를 사용해서 스레드를생성하였으면,

 

C/C++ 런타임 라이브러리의 시그널 함수를 사용할수없다.(제대로 작동하지 않는다))

 

 5. 원하는 스레드 함수가 호출되고 원하는 파라메터가 전달된다. 함수의 주소가 회수되고

 

tiddata블록에서 _beginthreadex에 의해 파라메터가 저장된다.

 

 6. 스레드 함수로부터 리턴 값은 스레드의 exit코드로 가정된다. 한가지 주의할 점은

 

_threadstartex는 BaseThreadStart에 단순히 리턴하지 않는다. 이렇게 다 처리된다면

 

스레드는 죽고 스레드의 exit 코드는 정확하게 설정된다. 그러나 스레드의 tiddata메모리

 

블럭은 제거되지않는다. 이것은 리소스의 낭비를 불러온다. 이런 낭비를 막기위해 C/C++

 

런타임 라이브러리 함수 _endthreadex가 호출되어 exit코드를 전달한다.

 


 

 

_endthreadex 함수는 다음과 같다.

 

 

사용자 삽입 이미지

 


 7. _endthreadex 내부에서 tiddata블럭을 해제하고 ExitThread를 호출하여 스레드가 실제

 

로 제거된다. 물론 exit코드는 전달되고, 정확히 설정된다.

Post to Twitter