POSIX pthread 라이브러리의 pthread_join과 pthread_detach이 차이와 사용법을 알아보자.
또한 왜 쓰레드 생성시 이 함수들를 써야하는지에 대해 정리한다.
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 함수는 스레드를 분리(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가 쓰레드 리소스를 해제해주는 역할을 하기 때문.
이를 이해하기 위해 스레드의 생명 주기와 운영 체제가 스레드를 관리하는 방식을 이해하는 것이 필요함.
생성 (Creation):
pthread_create를 호출하면 새로운 스레드가 생성되고, 지정된 함수가 실행된다.
실행 (Execution):
스레드가 작업을 수행한다.
종료 (Termination):
스레드 함수가 반환되거나 pthread_exit이 호출되면 스레드가 종료된다. 이 시점에서 스레드는 종료되었지만 리소스 해제가 되지않은 상태인 좀비 스레드(zombie thread)가 된다.

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