Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

ptread_join(3)

1장. ptread_join(3)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 에러
1.5절. 예제

다른 쓰레드가 종료되는걸 기다린다.


1.1절. 사용법

#include 

int pthread_join(pthread_t th, void **thread_return);
		


1.2절. 설명

pthread_join 는 실별번호 th 로 시작된 쓰레드가 종료되는걸 기다린다. 이러헌 쓰레드의 종료는 pthread_exit(3)로 종료되거나 혹은 리턴되는 경우 발생한다.

만약 thread_return값이 NULL 이 아니라면, th의 리턴값이 저장된 영역이 전달되게 된다.

th 식별번호를 가지는 쓰레드가 join 되기 위해서는 반드시 joinable 상태의 쓰레드로 작동하고 있어야지만 한다. 만약 기다리는 쓰레드가 pthread_detach(3) 함수를 통해서 detached 상태가 되었거나 혹은 pthread_create(3)로 실행될때 PTHREAD_CREATE_DETACHED 특성으로 실행되었다면 join 으로 기다릴수 없게 된다.

joinable 쓰레드가 종료되면, 종료된다고 하더라도 즉시 메모리 자원등이 해제 되지 않는다. pthread_join 함수를 만나야지만 자원이 해제된다. 그럼으로 모든 joinable 쓰레드에 대해서는 반드시 pthread_join 을 호출해주어야 한다. 그렇지 않을경우 메모리 누수가 발생할것이다.


1.3절. 반환값

성공할경우 쓰레드식별자인 thread에 쓰레드 식별번호를 저장하고, 0을 리턴한다. 실패했을경우 0 이 아닌 에러코드 값을 리턴한다.


1.4절. 에러

ESRCH

식별번호 th가 잘못된 식별번호 일 경우

EINVAL

식별번호 th 쓰레드가 detached 상태일경우


1.5절. 예제

#include <pthread.h>
#include <stdlib.h>

// 쓰레드 함수
void *test(void *data)
{
    int i;
    int a = *(int *)data;
    for (i = 0; i < 10; i++)
    {
        printf("%d\n", i*a);
    }
    return (void *)(i * 100);
}

int main()
{
    int a = 100;
    pthread_t thread_t;
    int status;

    // 쓰레드를 생성한다. 
    if (pthread_create(&thread_t, NULL, test, (void *)&a) < 0)
    {
        perror("thread create error:");
        exit(0);
    }

    // 쓰레드가 종료되기를 기다린후 
    // 쓰레드의 리턴값을 출력한다. 
    pthread_join(thread_t, (void **)&status);
    printf("Thread End %d\n", status);
    return 1;
}