4. 쓰레드 조인과 분리

System Program/pthread 2014. 3. 7. 14:01

1. 쓰레드 조인

 

pthread_create()함수를 통해 생성된 쓰레드는 다른 쓰레드에 의해 아니면 자체적으로 종료될 수 있다.

쓰레드 조인은 주 쓰레드가 추가적으로 생성된 쓰레드의 종료 상태를 확인하고

자신이 최종적으로 종료하겠다는 내포적인 의미를 갖는다.

 

즉 다른 장에서 기술한 것처럼 주 쓰레드가 종료하면 다른 추가적으로 생성된 쓰레드 또한 모두

강제적으로 즉시 종료한다. 쓰레드 조인은 주 쓰레드가 추가적인 쓰레드가 모든 작업을 완료할 수 있게

기다려 주며 마지막까지 살아서 모든 쓰레드의 인무가 완료될 때까지 책임지는 구조이다.  

 

#include <pthread.h>

 

int pthread_join(pthread_t thread, void **retval);

 

성공하면 '0'을 리턴, 에러가 발생하면 에러 번호(양수)를 리턴한다.  

 

pthread_join() 함수의 retval 값은 pthread_exit() 함수를 통해서 설정한 값을 확인할 수 있다.

 

1.1. 명심해야 할 사항.

 

pthread_create() 함수에서 atrribute NULL로 주고 기본적으로 생성된 쓰레드는 쓰레드 조인으로

종료를 시켜줘야 한다. 그렇지 않으면 좀비 쓰레드가 계속적으로 생성되어 차후에는

더 이상 쓰레드를 생성할 수 없는 상태로 빠지게 된다.   

   

 1.2. 예제

 

예제는 쓰레드 생성 부분을 참조하길 바람.

 

2. 쓰레드 분리

 

기본적으로 쓰레드는 조인할 수 있다. 만약 쓰레드의 종료 상태를 주 쓰레드에서 확인할 필요가 없거나

추가적인 쓰레드의 뒷정리를 시스템에서 자동적으로 하기를 원할 때는 쓰레드를 아래 함수를 통해서 분리한다.

 

#include <pthread.h>

 

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
: