-
반응형
일반적으로 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로 쓰레드가 생성되도록 한다.
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 옵션을 줄 수 있다.
if( pthread_create(&thread,&attr, &test_thread, NULL ) != 0 ) return 1; pthread_detach(thread);
이 옵션을 몰랐을 때는, pthread_join을 해주는 쓰레드를 만들어서 모든 쓰레드를 모니터링을 하게 해야 해나 하는 구상까지 했었는데 간단하게 해결할 수 있는 문제였다.
참고적으로 첫번째 방법을 추천한다. 쓰레드의 속성을 운용중에 변경되는것은 로직상의 혼란을 줄 수 있고, 거의 그럴일은 없겠지만 detach 옵션을 주기전에 이미 해당 쓰레드가 끝나버릴 수도 있을 가능성이 있기 때문이다.
반응형