(http://www.morenice.kr/75)
pthread 자원 해제에 대한 이야기(pthread_detach, pthread_attr_setdetachstate)
2012/01/11 00:25
일반적으로 pthread_create를 통해서 쓰레드가 생성되고 다 사용된 쓰레드는 해당 쓰레드를 호출한 곳에서 pthread_join을 통하여 해당 쓰레드의 자원을 해제하여 종료하는 흐름을 갖습니다. 만약 생성된 쓰레드를 pthread_join으로 처리하지 않는다면 아무리 쓰레드가 종료되었다고 해도 자원이 반환되지 않습니다. 이렇게 남겨진 자원은 메모리릭으로 간주되기 때문에 pthread_join은 쓰레드간의 동기작업과 자원 해제를 위해 필수적입니다.
하지만 pthread_join을 하지 않고도, 생성된 쓰레드가 종료될 때 알아서 자원을 시스템에게 반환하는 detach 옵션이 있습니다.
말그대로 독립적으로 운용하게 하라라는 의미로 생각되며(물론 자원적인면에서만), detach 옵션을 주는 방법은 두가지가 있습니다.
첫번째로, pthread_create할 때, 생성될 쓰레드 속성값에 detach를 설정하여 새로 생성될 쓰레드는 독립적으로 자원을 해제하도록 하게 할 수 있습니다.
#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
아래와 같이 pthread_attr_t에 detach 옵션을 먼저 설정하고, 쓰레드를 생성하는 시점인 pthread_create에 설정된 pthread_attr_t를 인자로 넘겨주어 detach로 쓰레드가 생성되도록 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | pthread_t thread ; pthread_attr_t attr; if ( pthread_attr_init(&attr) != 0 ) return 1; if ( pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0 ) return -1; if ( pthread_create(& thread ,&attr, &test_thread, NULL ) != 0 ) return -1; if ( pthread_attr_destroy(&attr) != 0 ) return -1; /* * while (1) * { * main thread logic... * } */ |
두번째는, 이미 생성된 쓰레드에게 detach 옵션을 주어 독립적으로 자원을 반환 하도록 하는 방법입니다.
#include <pthread.h>
int pthread_detach(pthread_t thread);
아래와 같이 thread를 생성 한 후에 detach 옵션을 줄 수 있습니다.
1 2 3 4 | if ( pthread_create(& thread ,&attr, &test_thread, NULL ) != 0 ) return 1; pthread_detach( thread ); |
이 옵션을 몰랐을 때는, pthread_join을 해주는 쓰레드를 만들어서 모든 쓰레드를 모니터링을 하게 해야 해나 하는 구상까지 했었는데 간단하게 해결할 수 있는 문제더군요.
참고적으로 첫번째 방법을 추천드립니다. 쓰레드의 속성을 운용중에 변경되는것은 로직상의 혼란을 줄 수 있고, 거의 그럴일은 없겠지만 detach 옵션을 주기전에 이미 해당 쓰레드가 끝나버릴 수도 있을 가능성이 있기 때문입니다.
- See more at: http://www.morenice.kr/75#sthash.Nhp4udj5.dpuf
'소프트웨어' 카테고리의 다른 글
[c언어] 데이터 영역을 설명한 포스트입니다. 재미있네요ㅎㅎ (0) | 2014.02.05 |
---|---|
[c++] pthread의 detach란... (0) | 2014.02.04 |
[c++] fwrite의 thread-safety란 (0) | 2014.02.03 |
[c++] 변수 선언에 대해서 (0) | 2014.01.29 |
[c++] const char vs char 비교 실험 (0) | 2014.01.28 |