http://lustformori.tistory.com/18


1. Win32 API의 CreateThread 대신 C Run Time Library의 _beginthreadex를 써야하는 경우 

1.부동 소수형 변수나 함수를 사용할 경우
2.C의 malloc과 free나 C++ 의 new와 delete 를 사용할경우 
3.stdio.h 나 io.h에서 어떤 함수를 호출한다면
4.strtok() 나 rand() 와 같이 정적 버퍼를 사용 하는 어떤 런타임 함수를 호출할 경우

 4번에 대한 부연 설명
c 런타임 함수들중 전역 자원을 쓰는 함수들이 있습니다.
strtok 같은것이 예이죠.
이런경우 멀티스레드 환경에서 문제가 될수 있기때문에 c 런타임 함수들을 위한 각각의 전역자원공간을 스레드마다 할당하는 함수가 _beginthread , _beginthreadex 라고 알고 있습니다. 
이 함수들도 내부적으로는 CreateThread를 호출하죠.
출처 : http://kldp.org/node/46904

위의 4가지 중 어떠한 동작도 수행하지 않는다면, 단일 쓰레드 라이브러리와 CreateThread함수를 사용하는 것이 안전합니다.



2. _beginthread 대신 _beginthreadex를 사용하는 이유

_beginthread는 쓰레드를 생성하고 바로 CloseHandle을 호출하므로, 이 때 반환되는 핸들로는 쓰레드 오브젝트와 통신할 수 없습니다. 이렇게 _beginthread가 동작하는 것은 Win32의 상세함을 숨기기 위해 고안되었지만 결국 버그가 되버린 함수가 되버렸고, _beginthreadex에서 수정되었습니다. 
출처 : http://www.fiadot.com/TatterTools/index.php?pl=476&setdate=200402&PHPSESSID=871516866c7e75a29140526552790ef2

3. _endthread와 _endthreadex를 명시적으로(explicitly) 호출할까 말까?
_beginthread는 _endthread와, _beginthreadex는 _endthreadex와 각각 짝을 이룹니다. _endthread와 _endthreadex는 스레드가 인자로 쓰인 루틴에서 되돌아올 때 자동으로 호출되나 명시적으로 호출할 수 있습니다. 

_endthread : Win32 CloseHandle API 처럼 자동으로 스레드 핸들을 닫습니다. 
따라서 Win 32 CloseHandle API 불러 명시적으로 스레드 핸들을 닫으면 안됩니다. 

_endthreadex : Win32 ExitThread API 처럼 스레드 핸들을 닫지 않습니다. 
따라서 Win 32 CloseHandle API 호출에 의한 스레드 핸들을 닫아야 합니다. 

결론 
_endthread와 _endthreadex는 모두 명시적으로 호출하지 않아도 자동으로 호출되지만, _beginthread를 사용했을 경우에는 CloseHandle를 호출하면 Exception이 발생합니다(Window NT 이상). 
반면에 _beginthreaex를 사용했을 경우에는 반드시 CloseHandle를 호출해야 합니다. 

Note : Libcmt.lib와 연관된 실행파일은 Win32 ExitThread API를 호출하면 안됩니다. 이는 스레드에 할당된 자원 회수를 방해합니다. _endthread 와 _endthreaex는 스레드에 할당된 자원을 회수한 수 ExitThread를 부릅니다. 
출처 : http://msdn2.microsoft.com/ko-kr/library/hw264s73(VS.80).aspx


반응형

+ Recent posts