ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pthread 자원 해제에 대한 이야기(pthread_detach, pthread_attr_setdetachstate)
    2012. 1. 11. comments
    반응형

    일반적으로 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 옵션을 주기전에 이미 해당 쓰레드가 끝나버릴 수도 있을 가능성이 있기 때문이다.



    반응형

    댓글

Designed by Tistory.