단막 Windows API
스레드의 생존 여부 확인하기
본 포스팅에서는 특정 핸들(HANDLE
)에 대한 스레드의 생존 여부, 다시 말해서 현재 실행중인지 종료되었는지 여부를 확인하는 방법을 정리한다.
GetExitCodeThread
스레드의 생존 여부를 확인할 수 있는 함수로는 GetExitCodeThread
가 있다. 이 함수의 원형은 다음과 같다.
BOOL GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode
);
hThread
는 생존 여부를 확인하고자 하는 스레드의 핸들(HANDLE
)이다. lpExitCode
를 통해 특정 스레드의 생존 또는 종료 코드를 얻을 수 있다.
생존 여부를 확인할 수 있으면 TRUE
를 반환하고 그렇지 않으면(즉, 오류가 발생하면) FALSE
를 반환한다. 이 때 오류 내용은 GetLastError
함수로 확인 가능하다.
스레드의 생존 여부를 위해 GetExitCodeThread
를 호출하는 예이다.
BOOL fResult = FALSE;
DWORD dwExitCode = 0;
/* ... */
fResult = GetExitCodeThread(/* THREAD */, &dwExitCode);
위와 같이 호출하여 dwExitCode
의 값이 STILL_ACTIVE
이면 해당 스레드는 현재 실행중인 상태임을 의미한다. 해당 스레드가 종료되었다면, 종료 당시 스레드 프로시저가 리턴한 값이 보관된다. 여기서 알 수 있는 사실은, 스레드 프로시저를 작성할 때 종료 코드를 STILL_ACTIVE
와 중복시키면 안 된다는 사실이다. STILL_ACTIVE
의 실제 값은 정수 259
이다.
실행 예제
static TCHAR szTextBuffer[4096];
HANDLE hThread = /* CreateThread(...) */;
DWORD dwErrorCode = 0;
/* ... */
GetExitCodeThread(hThread, &dwErrorCode);
if (dwErrorCode == STILL_ACTIVE) {
_stprintf(szTextBuffer, TEXT("WM_USER: hThread = %08p, dwErrorCode = STILL_ACTIVE\n"), hThread);
} else {
_stprintf(szTextBuffer, TEXT("WM_USER: hThread = %08p, dwErrorCode = %08lx\n"), hThread, dwErrorCode);
}
OutputDebugString(szTextBuffer);
/* ... */
버튼으로 채워진 창을 하나 열고, 이 창이 열릴 때 오랜 시간이 걸리는 작업을 수행하는 콘솔창도 하나 더 띄운다. 이 콘솔창은 스레드가 종료되면 자동으로 닫힌다. 버튼을 클릭하면 GetExitCodeThread
을 실행하여 해당 스레드의 생존 여부를 디버그 출력창으로 보일 것이다.