http://lino.egloos.com/2403029
ExitThread에 대한 발견
흔히들 쓰레드 생성시에, CreateThread로 생성해서, ExitThread로 쓰레드 종료를 시키는 경우가 있는데, C에서라면, 리소스 정리를 프로그래머가 다 하기 때문에, ExitThread로 쓰레드를 종료시켜도 상관없지만, C++에서는 ExitThread로 쓰레드를 생성시키면 문제가 생길 수 있다.
예를 들어서 아래와 같은 클래스가 있을 경우..
class CFoo
{
public:
CFoo(){}
virtual ~CFoo()
{
OutputDebugString("CFoo Destructor is called! ");
}
void DoSomething() { OutputDebugString("Do Something! "); }
};
위와 같은 코드가 있고, 쓰레드 프로시져로 아래의 함수가 있는 경우..
DWORD ThreadProc( LPVOID pParam)
{
CFoo foo;
....
foo.DoSomething();
....
ExitThread(0);
}
이 경우, 소멸자가 불릴까? 안불릴까? 정답은 안불린다.
ExitThread가 쓰레드 스택을 말끔히 정리하면서, 소멸자나 리소스 해제같은거 안하고, 그냥 쓰레드를 종료시켜 버린다.
만약에 클래스에서 시스템 자원을 사용하고 있고, 소멸자에서 그 시스템 자원을 해제하는 경우, 바로 리소스 릭이 생긴다.
따라서, C++에서는 쓰레드 종료시 반드시, 종료 값을 리턴해 주는 방식으로 쓰레드를 종료시켜 줘야 한다.
_beginthread, _beginthreadex 역시 마찬가지다.
그리고, _beginthread는 쓰레드 핸들을 자기가 닫는다, _beginthreadex와 ExitThread는 프로그래머가 직접 닫아 줘야 한다.
'운영체제 & 병렬처리 > Multithread' 카테고리의 다른 글
WaitForSingleObject 함수 (0) | 2012.11.01 |
---|---|
CreateThread 와 _beginthread, _beginthreadex 의 차이 (0) | 2012.11.01 |
CreateMutex() (0) | 2012.11.01 |
동기화 함수들... [쓰레드 동기화(실행순서 동기화) -이벤트,타이머] (2) | 2012.11.01 |
유저모드 동기화 VS 커널모드 동기화 (0) | 2012.11.01 |