반응형


윈도우에서 쓰레드 생존여부를 검사하는 방법은 검색으로도 쉽게 나오고 어디에서나 이렇게 쓰라고 되어 있기 때문에 금방 찾을 수 있었지만
유닉스 계열에서는 그 방법을 찾기가 쉽지 않았다. 오늘 그 방법을 드디어 알아내서 기쁜 마음에 까먹을까봐 블로깅 해놓음.
너무 기쁘다 으아아

------------------------------------------------------------------------------------
윈도우에서 쓰레드의 생존여부를 검사하는 함수는 GetExitCodeThread 함수를 사용하게 됨.
GetExitCodeThread 함수는 retval 부분에 현재 쓰레드의 상태를 기록해 주기 때문에 해당 값을 이용해서 쓰레드를 관리할 수 있게 된다.

함수 원형
BOOL GetExitCodeThread(HANDLE hThread, LPDWORD ipExitCode);

리턴 값
생존시 : ipExitCode가 STILL_ACTIVE로 셋팅됨.
종료시 : 스레드가 시작한 함수의 리턴값, 강제종료시에는 ExitThread 함수의 인수가 리턴.

예제)
HANDLE MyThread;
DWORD ipExitCode;

GetExitCodeThread(MyThread,&ipExitCode);
if(ipExitCode == STILL_ACTIVE) 
{
// 살아 있음.
}
else 
{
// 죽었음.
}
------------------------------------------------------------------------------------



------------------------------------------------------------------------------------
유닉스 계열에서는 pthread를 사용하기 때문에 함수가 다름.
유닉스 혹은 리눅스에서 pthread.h 파일을 이용해서 코딩하게 될 경우 pthread_kill 함수를 사용하면 되는데
해당 함수는 쓰레드 아이디와 시그널을 해당 쓰레드에 전달하여 쓰레드 생존 여부를 확인하는 약간 꽁수 같은 방법이라고 할 수 있겠다.
컴파일 할 때는 gcc -o (output) (input) -lpthread(pthread Library를 링크해줄 것)

함수 원형
int pthread_kill(pthread_t thread_id, int sig);

리턴 값
성공 : 0
실패 : ERROR
ESRCH : 해당 THREAD_ID를 찾을 수 없을 때.
EINVAL : 잘못된 Signal을 전달할 경우.

예제)
#include<pthread.h>
#include<signal.h>
#include<errno.h> // 필요시 추가.

pthread_t MyThread;
int status;

status = pthread_kill(MyThread,0);
if ( status == ESRCH ) // 존재하지 않는 쓰레드 아이디일때, 다시 살리면 된다.
{   
}
else if ( status == EINVAL ) // 잘못된 시그널을 전달했을 경우.


else // 현재 쓰레드는 생존해 있다.
{
}
------------------------------------------------------------------------------------

반응형

+ Recent posts