리눅스

pthread 사용시 주의할점과 tread detach, join에 관해

개발새발 2017. 12. 14. 22:48
반응형

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가 끝날 수도 있기 때문.




반응형