쓰레드의 소멸 ------------------------------------------------------------------------------------------------

일단 아래의 그림을 보자.


하나의 프로세스가 생성되면 그 프로세스의 메인쓰레드와 메인쓰레드에서 앞서 설명한 쓰레드생성 함수나 몇가지 방법을 통해서 쓰레드가 생성될 것이다. 메인쓰레드에 쓰레드 A B C는 종속적이라고 할수 있다. 이유는 아래 설명한다.

메인쓰레드의 특징은 메인쓰레드가 return 0 명령으로 종료되면 프로세스 그 자체가 종료된다는 것이다. 다른 쓰레드가 하던일을 끝마치기도 전에 종료가 될수 있다. 프로세스가 종료되면 당연히 쓰레드도 종료된다. 

하지만 다른 A B C의 return 문은 자신의 쓰레드(실행흐름)만 종료시키는 결과를 가진다.


쓰레드의 소멸방법 --------------------------------------------------------------------------------------------

1. 각 쓰레드 함수에서 return 문으로 종료하는 방법 -> (가장 이상적인 방법)

2. ExitThread 함수를 사용하는 방법 -> 이 함수는 현재 실행중인 쓰레드를 종료할때 사용한다.

VOID ExitThread( DWORD dwExitCode ); 가 함수의 원형이다.

이 방법의 장점은 언제 어디서나 자신이 원하는 쓰레드를 종료시킬수 있다는 점이다. 또한 다른 프로그래머가 쓰레드의 구조를 파악할때. 이 함수를 보고 쓰레드의 종료시점을 예측하기 편하다.



하지만 한가지 주의할 사항이 있다. C++(내가 사용하는 프로그래밍 언어) A, B 함수의 스택영역에 객체가 존재한다고 할때 C함수에서 ExitThread 함수가 호출된다면 A, B함수의 스택영역에 존재하는 객체의 소멸자가 호출되지 않아서 메모리릭이 날 수가 있다.

3. CreatdThread 함수를 이용해서 얻게되는 핸들을 통해서 다른 쓰레드를 종료하는 방법

만약 쓰레드의 핸들을 가지고 있다음 다음 함수를 이용해 쓰레드를 종료시킬수 있다.

BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode );

첫번째 인자는 당연히 종료시킬 쓰레드의 핸들이며 두번째 인자는 해당 쓰레드의 커널 오브젝트에 등록된다.

이 함수의 문제점은 쓰레드를 강제종료 시킨다는 점이다. 다시 말해서 종료의 대상이 되는 쓰레드는 종료가 되는 시점까지도 자신이 종료된다는 사실을 모르므로 당연히 할당된 메모리가 남아있건 어떤 상황이건 종료가 되어버린다.

책에도 나와있지만 그다지 권장하는 방법은 아니다.

Posted by JJOREG