4. 쓰레드 조인과 분리
System Program/pthread 2014. 3. 7. 14:011. 쓰레드 조인
pthread_create()함수를 통해 생성된 쓰레드는 다른 쓰레드에 의해 아니면 자체적으로 종료될 수 있다.
쓰레드 조인은 주 쓰레드가 추가적으로 생성된 쓰레드의 종료 상태를 확인하고
자신이 최종적으로 종료하겠다는 내포적인 의미를 갖는다.
즉 다른 장에서 기술한 것처럼 주 쓰레드가 종료하면 다른 추가적으로 생성된 쓰레드 또한 모두
강제적으로 즉시 종료한다. 쓰레드 조인은 주 쓰레드가 추가적인 쓰레드가 모든 작업을 완료할 수 있게
기다려 주며 마지막까지 살아서 모든 쓰레드의 인무가 완료될 때까지 책임지는 구조이다.
int pthread_join(pthread_t thread, void **retval);
성공하면 '0'을 리턴, 에러가 발생하면 에러 번호(양수)를 리턴한다.
pthread_join() 함수의 retval 값은 pthread_exit() 함수를 통해서 설정한 값을 확인할 수 있다.
1.1. 명심해야 할 사항.
pthread_create() 함수에서 atrribute NULL로 주고 기본적으로 생성된 쓰레드는 쓰레드 조인으로
종료를 시켜줘야 한다. 그렇지 않으면 좀비 쓰레드가 계속적으로 생성되어 차후에는
더 이상 쓰레드를 생성할 수 없는 상태로 빠지게 된다.
1.2. 예제
예제는 쓰레드 생성 부분을 참조하길 바람.
2. 쓰레드 분리
기본적으로 쓰레드는 조인할 수 있다. 만약 쓰레드의 종료 상태를 주 쓰레드에서 확인할 필요가 없거나
추가적인 쓰레드의 뒷정리를 시스템에서 자동적으로 하기를 원할 때는 쓰레드를 아래 함수를 통해서 분리한다.
int pthread_detach(pthread_t thread);
성공하면 '0'을 리턴, 에러가 발생하면 에러 번호(양수)를 리턴한다.
2.1. 주의 사항
위 쓰레드 조인에서도 기술한 것처럼 주 쓰레드가 종료되면 추가적인 쓰레드도 모두 즉시 강제적으로 종료된다.
따라서 쓰레드 분리 통해 추가적인 쓰레드를 분리하기는 했지만 분리된 쓰레드가 정상적으로 모두
일처러를 완료하기 위해서는 주 쓰레드는 종료해서는 안된다. 보통 주 쓰레드는 무한 루프를 도는 것이 일반적이다.
2.2. 예제
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // 쓰레드 함수 // 1초를 기다린후 아규먼트^2 을 리턴한다. void *t_function(void *data) { char a[100000]; int num = *((int *)data); printf("Thread Start\n"); sleep(5); printf("Thread end\n"); } int main() { pthread_t p_thread; int thr_id; int status; int a = 100; printf("Before Thread\n"); thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } // 식별번호 p_thread 를 가지는 쓰레드를 detach // 시켜준다. pthread_detach(p_thread); pause(); return 0; }
위의 예제는 pthread_detach()함수의 사용 예를 보기위해서 인용하였으나 일관된 쓰레드 생성 관리를
위해서 attrubute를 사용하는 것이 더 좋은 방법이라 생각된다.
'System Program > pthread' 카테고리의 다른 글
9. 쓰레드와 시그널 (0) | 2014.03.10 |
---|---|
3. 쓰레드 종료 및 연관 함수 (0) | 2014.03.07 |
2. pthread 생성 (0) | 2014.03.07 |
6. pthread attribute - (2) (0) | 2013.07.12 |
8. 쓰레드 클린업 핸들러(쓰레드 취소와 연관) (0) | 2013.07.03 |