[시스템 프로그래밍] pthread_join, pthread_detach 예시 및 사용이유

김예찬·2024년 6월 26일

POSIX pthread 라이브러리의 pthread_join과 pthread_detach이 차이와 사용법을 알아보자.
또한 왜 쓰레드 생성시 이 함수들를 써야하는지에 대해 정리한다.

pthread_join

pthread_join 함수는 호출한 스레드가 지정된 스레드가 종료될 때까지 기다린다. 이를 통해 스레드의 종료를 동기화하고, 종료된 스레드의 반환 값을 수집한다.

특징

동기화: 호출한 스레드는 지정된 스레드가 종료될 때까지 기다림
반환 값 수집: 스레드가 종료될 때 반환한 값을 수집
리소스 해제: pthread_join을 호출하면 스레드의 종료 상태를 수집하고, 그 스레드가 사용한 리소스를 해제

void *thread_function(void *arg) {
    // 스레드 작업 수행
    return (void *)42;
}

int main() {
    pthread_t thread;
    void *ret_val;

    // 스레드 생성
    pthread_create(&thread, NULL, thread_function, NULL);

    // 스레드 종료 대기 및 반환 값 수집
    pthread_join(thread, &ret_val);

    printf("Thread returned: %ld\n", (long)ret_val);
    return 0;
}

pthread_detach

pthread_detach 함수는 스레드를 분리(detach)하여 스레드가 종료될 때 자동으로 그 스레드가 사용한 리소스를 해제한다. 이를 통해 pthread_join을 호출하지 않아도 스레드 리소스가 자동으로 관리된다.

특징

비동기적 종료: 스레드가 종료될 때 호출한 스레드가 기다리지 않음
자동 리소스 해제: 스레드가 종료될 때 자동으로 리소스가 해제
반환 값 수집 불가: 분리된 스레드의 반환 값을 수집할 수 없음

void *thread_function(void *arg) {
    // 스레드 작업 수행
    pthread_exit((void *)42);
}

int main() {
    pthread_t thread;

    // 스레드 생성
    pthread_create(&thread, NULL, thread_function, NULL);

    // 스레드 분리
    pthread_detach(thread);

    // 분리된 스레드의 반환 값 수집불가
    // 스레드는 백그라운드에서 종료되고 자동으로 리소스가 해제됨

    // 메인 스레드 작업 수행
    sleep(2); // 예시를 위해 추가한 지연
    printf("Main thread finished\n");
    return 0;
}

쓰레드 생성 후 꼭 pthread_join 또는 pthread_detach를 해줘야하는가?

반드시 해야하는 것은 아니지만 하지 않을 경우 리소스 누수가 발생할 수 있다. pthread_joinpthread_detach가 쓰레드 리소스를 해제해주는 역할을 하기 때문.

이를 이해하기 위해 스레드의 생명 주기와 운영 체제가 스레드를 관리하는 방식을 이해하는 것이 필요함.

쓰레드의 생명주기

  1. 생성 (Creation):

    pthread_create를 호출하면 새로운 스레드가 생성되고, 지정된 함수가 실행된다.

  2. 실행 (Execution):

    스레드가 작업을 수행한다.

  3. 종료 (Termination):

    스레드 함수가 반환되거나 pthread_exit이 호출되면 스레드가 종료된다. 이 시점에서 스레드는 종료되었지만 리소스 해제가 되지않은 상태인 좀비 스레드(zombie thread)가 된다.

즉, 쓰레드의 실행이 종료된 후 해당 쓰레드에 할당된 리소스를 해제해주기 위해 pthread_join이나 pthread_detach를 사용하는 것이 필요하다.

0개의 댓글