[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);
Argument | Description |
---|---|
pthread_t *restrict thread | Thread를 가리키는 주소 |
const pthread_attr_t *restrict attr | Thread의 속성을 설정 |
void (start_routine)(void *) | Thread 생성 시 수행하고자 하는 함수 |
void *restrict arg | 실행하는 함수의 arguments |
Return | Description |
---|---|
Any value | Thread 종료 시 반환 값 |
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);
Argument | Description |
---|---|
pthread_t thread | 기다리고자 하는 thread ID |
void **retval | 기다리고 있는 thread가 종료 시 return되는 값이다. |
Return | Description |
---|---|
0 | 성공적으로 thread join 완료 |
그 외 | Error code를 나타낸다. |
pthread_exit
기존에 있는 exit() 함수는 process 전체를 종료하는 반면, pthread_exit은 해당 thread만 종료한다.
#include <pthread.h> void pthread_exit(void *retval);
Argument | Description |
---|---|
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