2. 기본 쓰레드 함수
주로 쓰레드 생성과 종료에 관련된 가장 기본적인 함수들이다.
2.1. pthread_create
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); |
성공적으로 생성될경우 0을 리턴한다.
예제 : pthread_create.cc
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // 쓰레드 함수 void *t_function(void *data) { int id; int i = 0; id = *((int *)data); while(1) { printf("%d : %d\n", id, i); i++; sleep(1); } } int main() { pthread_t p_thread[2]; int thr_id; int status; int a = 1; int b = 2; // 쓰레드 생성 아규먼트로 1 을 넘긴다. thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } // 쓰레드 생성 아규먼트로 2 를 넘긴다. thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b); if (thr_id < 0) { perror("thread create error : "); exit(0); } // 쓰레드 종료를 기다린다. pthread_join(p_thread[0], (void **)&status); pthread_join(p_thread[1], (void **)&status); return 0; } |
2.2. pthread_join
#include <pthread.h> int pthread_join(pthread_t th, void **thread_return); |
pthread_joinc.c
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // 쓰레드 함수 // 1초를 기다린후 아규먼트^2 을 리턴한다. void *t_function(void *data) { int num = *((int *)data); printf("num %d\n", num); sleep(1); return (void *)(num*num); } int main() { pthread_t p_thread; int thr_id; int status; int a = 100; thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } // 쓰레드 식별자 p_thread 가 종료되길 기다렸다가 // 종료리턴값을 가져온다. pthread_join(p_thread, (void *)&status); printf("thread join : %d\n", status); return 0; } |
2.3. pthread_detach
int pthread_detach(pthread_t th); |
여기에서는 pthread_create 호출후 detach 하는 방법을 설명하고 있는데, pthread_create 호출시에 쓰레드가 detach 되도록 할수도 있다. 이에 대한 내용은 pthread_attr_setdetachstate 를 다루면서 설명하도록 하겠다.
예제 : pthread_detach.c
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // 쓰레드 함수 // 1초를 기다린후 아규먼트^2 을 리턴한다. void *t_function(void *data) { char a[100000]; int num = *((int *)data); printf("Thread Start\n"); sleep(5); printf("Thread end\n"); } int main() { pthread_t p_thread; int thr_id; int status; int a = 100; printf("Before Thread\n"); thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } // 식별번호 p_thread 를 가지는 쓰레드를 detach // 시켜준다. pthread_detach(p_thread); pause(); return 0; } |
[root@localhost test]# while [ 1 ]; do ps -aux | grep pthread | grep -v grep | grep -v vim; sleep 1; done root 2668 0.0 0.1 1436 292 pts/8 S 18:37 0:00 ./pthread_detach root 2668 0.0 0.1 1436 292 pts/8 S 18:37 0:00 ./pthread_detach |
2.4. pthread_exit
void pthread_exit(void *retval); |
예제 : pthread_exit.c
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> // 쓰레드 함수 // 1초를 기다린후 아규먼트^2 을 리턴한다. void *t_function(void *data) { int num = *((int *)data); int i = 0; while(1) { if (i == 3) pthread_exit(0); printf("loop %d\n", i); i++; sleep(1); } } int main() { pthread_t p_thread; int thr_id; int status; int a = 100; thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } pthread_join(p_thread, (void **)&status); return 0; } |
2.5. pthread_cleanup_push
void pthrad_cleanup_push(void (*routine) (void *), void *arg); |
cleanup handlers 는 주로 자원을 되돌려주거나, mutex 잠금등의 해제를 위한 용도로 사용된다. 만약 mutex 영역에서 pthread_exit 가 호출되어 버릴경우 다른쓰레드에서 영원히 block 될수 있기 때문이다. 또한 malloc 으로 할당받은 메모리, 열린 파일지정자를 닫기 위해서도 사용한다.
예제 : pthread_cleanup.c
#include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> // 쓰레드 함수 // 1초를 기다린후 아규먼트^2 을 리턴한다. // char *mydata; void cleanup(void *); void *t_function(void *data) { int num = *((int *)data); int i = 0; int a = 1; // cleanup handler 로 cleanup 함수를 // 지정한다. pthread_cleanup_push(cleanup, (void *)&a); mydata = (char *)malloc(1000); while(1) { if (i == 3) { // pthread_exit 가 호출되면서 // cleanup 을 호출하게 된다. pthread_exit(0); return 1; } printf("loop %d\n", i); i++; sleep(1); } pthread_cleanup_pop(0); } int main() { pthread_t p_thread; int thr_id; int status; int a = 100; thr_id = pthread_create(&p_thread, NULL, t_function, (void *)&a); if (thr_id < 0) { perror("thread create error : "); exit(0); } pthread_join(p_thread, (void **)&status); printf("Join finish\n"); } // cleanup handler void cleanup(void *myarg) { printf("thread is clean up\n"); printf("resource free\n"); free(mydata); } |
2.6. pthread_cleanup_pop
pthread_cleanup_push 와 함께 사용되며, install 된 cleanup handler 을 제거하기 위해서 사용된다.
void pthread_cleanup_pop(int execute); |
그리고 pthread_cleanup_push 와 pthread_cleanup_pop 은 반드시 같은 함수내의 같은 레벨의 블럭에서 한쌍으로 사용해야 한다.
2.7. pthread_self
pthread_t pthread_self(void); |
예제 : pthread_self.c
#include <pthread.h> #include <stdio.h> void *func(void *a) { pthread_t id; id = pthread_self(); printf("->%d\n", id); } int main(int argc, char **argv) { pthread_t p_thread; pthread_create(&p_thread, NULL, func, (void *)NULL); printf("%d\n", p_thread); pthread_create(&p_thread, NULL, func, (void *)NULL); printf("%d\n", p_thread); return 1; } |
출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/Pthread_API_Reference
'프로그래밍' 카테고리의 다른 글
리눅스에서 fflush() 안 될때 해결책 (0) | 2009.04.23 |
---|---|
쓰레드 동기화 함수 (0) | 2008.04.28 |
fork와 thread의 차이점 (0) | 2008.04.28 |
간단한 thread 함수 예제 (0) | 2008.04.28 |
이진 탐색 트리 (0) | 2008.04.28 |