반응형
pthread를 사용하는 멀티스레드 프로그램에서 여러가지 테스트 중 메모리 누수가 발생했다.
분석 결과 매번 어떤 기능을 할 때 pthread_create를 통해 생성 된 새로운 thread가 작업을 처리하고 thread가 끝나는 구조인데
pthread_create 후 메모리를 회수 하지 않아서 문제가 되었다.
예제처럼 pthread를 사용하면 memory leak발생가능
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include<pthread.h> #include<unistd.h> #include<stdlib.h> #include<stdio.h> void *thread_test(void * data){ char * str = (char*)malloc(sizeof(1024)); printf("ThreadStart\n"); sleep(5); printf("TrheadEnd\n"); return NULL; } int main(void){ pthread_t pid; pthread_create(&pid, NULL, thread_test, NULL); if(pid<0){ perror("pthread_create error"); exit(0); } pause(); return 0; } | cs |
결론적으로 pthread_create후 join 또는 detach를 수행해 주어야 한다.
pthread_detach(:3)함수는 쓰레드 식별자th를 가지는 쓰레드를 메인쓰레드에서 분리 시킨다. 이것은 th를 가지는 쓰레드가 종료되는 즉시 쓰레드의 모든 자원을 되돌려(free)줄 것을 보증한다. detach상태가 아닐경우 쓰레드가 종료한다고 하더라도 pthread_join(3)을 호출하지 않는 한 자원을 되돌려주지 않는다.
[해결책]
1)int pthread_join(pthread_t th, void **thread_return);
2)int pthread_detach(pthread_t th);
3)
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
*ps : detach를 사용한다면 3번 방법을 추천한다. 이유는 pthread_detach함수가 불리기 전에 새로 생성 된 thread가 끝날 수도 있기 때문.
반응형
'리눅스' 카테고리의 다른 글
[glib] 메인루프 (0) | 2018.03.04 |
---|---|
리눅스 signal (0) | 2018.02.17 |
pthread에서 메모리 침범과 pthread_cancel (1) | 2018.01.21 |
정적 라이브러리(static library)와 공유 라이브러리(shared library) (0) | 2018.01.14 |
Dead lock과 pthread에서 mutex lock하는 방법 (2) | 2018.01.07 |