반응형
윈도우에서 쓰레드 생존여부를 검사하는 방법은 검색으로도 쉽게 나오고 어디에서나 이렇게 쓰라고 되어 있기 때문에 금방 찾을 수 있었지만
유닉스 계열에서는 그 방법을 찾기가 쉽지 않았다. 오늘 그 방법을 드디어 알아내서 기쁜 마음에 까먹을까봐 블로깅 해놓음.
너무 기쁘다 으아아
------------------------------------------------------------------------------------
윈도우에서 쓰레드의 생존여부를 검사하는 함수는 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
{
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 // 현재 쓰레드는 생존해 있다.
{
}
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
유닉스 계열에서는 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 // 현재 쓰레드는 생존해 있다.
{
}
------------------------------------------------------------------------------------
반응형
'Coding Tip > C/C++' 카테고리의 다른 글
C/C++에서 NULL 포인터를 delete 하면 어떻게 되는가? (0) | 2013.10.15 |
---|---|
[C/C++] 파일 입출력 함수들 모음 (0) | 2013.02.14 |
wait(), waitpid() 옵션 별 사용 설명 (0) | 2012.09.03 |
[C / C++] PATH로 디렉토리 생성 (1) | 2011.10.24 |
파일 내용을 거꾸로 읽기 tail 구현 (FILE 구조체, fseek() 사용) (0) | 2011.07.14 |