Linux,  Programming

[Linux] Pthread 개념 (pthread_create / pthread_join / pthread_exit)

Thread는 process와 다르게 thread 끼리는 서로 메모리를 공유한다. (물론 process간 메모리를 공유하는 부분이 있다.)
특히 global variable을 thread간은 공유하며, process간은 공유하지 않는다. 또한 local variable은 process간 모두 공유하지 않고 thread는 공유한다.

Linux에선 pthread_create() 함수를 통해 thread를 생성 할 수 있다.

pthread_create

새로운 thread를 생성하는 함수

#include <pthread.h>

       int pthread_create(pthread_t *restrict thread,
                          const pthread_attr_t *restrict attr,
                          void *(*start_routine)(void *),
                          void *restrict arg);
ArgumentDescription
pthread_t *restrict threadThread를 가리키는 주소
const pthread_attr_t *restrict attrThread의 속성을 설정
void (start_routine)(void *)Thread 생성 시 수행하고자 하는 함수
void *restrict arg실행하는 함수의 arguments
ReturnDescription
Any valueThread 종료 시 반환 값

Example

#include <stdio.h>
#include <pthread.h>

void *func (void *arg) {
    printf("\t\t\tChild\n");
    return 0;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, 0, func, 0);
    pthread_join(thread, 0);
    printf("Parent\n");
    return 0;
}
$ gcc thread.c -lpthread
               Child
Parent

참고로 pthread는 third-party-library이기 때문에 빌드 할 때 library 명시를 해줘야 한다.

pthread_join

Process의 wait()에 해당하는 함수로 child thread가 종료 될 때까지 기다린다.

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);
ArgumentDescription
pthread_t thread기다리고자 하는 thread ID
void **retval기다리고 있는 thread가 종료 시 return되는 값이다.
ReturnDescription
0성공적으로 thread join 완료
그 외Error code를 나타낸다.

pthread_exit

기존에 있는 exit() 함수는 process 전체를 종료하는 반면, pthread_exit은 해당 thread만 종료한다.

#include <pthread.h>

void pthread_exit(void *retval);
ArgumentDescription
void *retval만약 pthread_join을 사용한 parent thread가 있을 경우 해당 함수 인자로 넘어온 reference로 return

Example

#include <pthread.h>
#include <unistd.h>
#include "errors.h"
void *thread_routine( void * arg ){
    printf("Child thread is running\n");
    sleep(3);
    return 0;
}

int main( int argc, char **argv ){
    pthread_t thread_id;
    void *thread_result;
    int status;

    DPRINTF( ("DEBUG mode is on\n") );  
    status = pthread_create( &thread_id,0,thread_routine,0);
    if( status != 0 )
        err_abort( status, "Create thread");

    status = pthread_join( thread_id, &thread_result );
    if( status != 0 )
        err_abort( status, "Join thread");
    if( thread_result == 0 )
        DPRINTF(("Child thread is finished\n"));

    pthread_exit(0);
    printf("main : after\n");
    return 0;
}
$ gcc -DDEBUG -lpthread thread.c
$ ./a.out 
   DEBUG mode is on
   Child thread is running
   Child thread is finished 

Leave a Reply

Your email address will not be published. Required fields are marked *