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는 프로그래머가 직접 닫아 줘야 한다.

반응형

+ Recent posts