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코드는 전달되고, 정확히 설정된다.
