-
반응형얼마전에 thead를 중간에 종료 시키는 방법에 대해서 이야기 했었다.
2012/01/12 - [리눅스(Linux)/개발(Developemnt)] - 생성된 pthread를 중간에 종료시키자.(pthread_cancel)
만약 thread에서 자원을 할당받아 사용 중이라면, thread가 종료 될 때 자원을 반환을 해줘야 할 필요가 있다. 물론 thread 내부 로직을 통하여 할당받은 자원(mutex, heap memory, fd,...)을 알맞게 반환하면 좋겠지만, 중간에 종료되는 경우에는 thread가 종료되기 때문에 자원 반환에 어려움이 있다.
결론적으로 pthread_cleanup_push를 통하여 callback 함수를 등록하면 thread가 종료될 때 등록된 callback 함수를 호출하여 자원을 반환 할 수 있다.
추가로, pthread_cleanup_push 는 스택형식으로 관리 되어 여러개의 함수를 등록할 수 있고 thread가 종료되면 제일 마지막에 등록된 함수부터 자동으로 호출된다. 또한 pthread_cleanup_pop 함수를 통해 등록된 함수들을 스택 제일 마지막에 있는 함수부터 등록 해제 할 수 있다.
참고사항으로 pthread_cleanup_push와 pop은 함께 사용해야 한다.예를 들어, 아래 예제 함수와 같이 함수내에 두개가 꼭 쌍으로 있어야 한다.
void start_thread(void* arg) { pthread_cleanup_push(cleanup_handler, NULL); pthread_cleanup_pop(0); }
아래는 full 예제이다.
#include <stdio.h> #include <pthread.h> void cleanup_handler(void *arg) { printf("cleanup_thread\n"); return; } void cleanup_handler2(void *arg) { printf("cleanup_thread2\n"); return; } void* start_new_thread(void *arg) { printf("start new thread ...\n"); pthread_cleanup_push(cleanup_handler, NULL); pthread_cleanup_push(cleanup_handler2, NULL); sleep(3); printf("end new thread...\n"); pthread_cleanup_pop(0); pthread_cleanup_pop(0); return NULL; } int main() { pthread_t thread; int ret; printf("start main thread....\n"); if( pthread_create(&thread, NULL, start_new_thread, NULL ) != 0 ) return 1; sleep(1); /* cancel!! */ pthread_cancel(thread); pthread_join(thread, (void**)&ret); printf("end main thread....\n"); return 0; }
위의 코드를 실행하면, 나중에 등록한 cleanup_thread2가 먼저 호출되고 cleanup_thread가 호출되는 것을 알 수 있습니다.
start main thread....
start new thread ...
cleanup_thread2
cleanup_thread
end main thread....반응형