API

TerminateThread사용시 생존여부 판단 주의(GetExitCodeThread 사용시 리턴값 주의)

디버그정 2010. 3. 16. 07:18

TerminateThread 로 강제종료시킬 경우,,,
스레드가 종료작업을 모두 마친 후에 리턴되지 않고,
커널에 종료시키라는 신호만 보내고 바로 리턴하는 듯하다.(이를테면 비동기적 처리)

DWORD WINAPI ThreadFun(LPVOID lp)
{
 Sleep(3000);
 return 0;
}

{
 DWORD tid;
 HANDLE hOneThread=CreateThread(NULL, 0, ThreadFun, NULL, 0, &tid);
 DWORD dwExitCode=NULL;TerminateThread(hOneThread, 0x9999);
 BOOL bSuc=GetExitCodeThread(hOneThread, &dwExitCode);
 char szText[256]={0};
 wsprintfA(szText, "bSuc: %d, dwExitCode: 0x%x", bSuc, dwExitCode);
 MessageBoxA(NULL, szText, "res", 0);
 CloseHandle(hOneThread);
...
}
위와 같은 코드실행시...
dwExitCode에는 여전히 작동중(STILL_ACTIVE)이라는 값이 들어가 있었다.

중간에 아래와 같이 딜레이를 좀 줄경우
 TerminateThread(hOneThread, 0x9999);
 Sleep(100);
 BOOL bSuc=GetExitCodeThread(hOneThread, &dwExitCode);
0x9999가 들어가거나, STATUS_THREAD_IS_TERMINATING 0xC000004B 값이 비로소 들어갔다.

스레드 생존중인지 판단할 경우 좀 유의할 필요가 있다...
이를테면 재수없게 TerminateThread로 강제종료시킬 당시에
살아있는지 판단하고자 할 경우 난감한 경우가 생길 것이다...
실제로 상당히 많은 다중스레드 작업 중에 이와 같은 경우때문에
에러가 생겼다, 안생겼다하는 젤 싫어하는 에러를 많이 봤다.