ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pthread 종료 핸들러(pthread_cleanup_push, pthread_cleanup_pop)
    2012. 1. 13. comments
    얼마전에 thead를 중간에 종료 시키는 방법에 대해서 이야기 했었다.

    2012/01/12 - [리눅스(Linux)/개발(Developemnt)] - 생성된 pthread를 중간에 종료시키자.(pthread_cancel)


    만약 thread에서 자원을 할당받아 사용 중이라면, thread가 종료 될 때 자원을 반환을 해줘야 할 필요가 있다. 물론 thread 내부 로직을 통하여 할당받은 자원(mutex, heap memory, fd,...)을 알맞게 반환하면 좋겠지만,  중간에 종료되는 경우에는 thread가 종료되기 때문에 자원 반환에 어려움이 있다.



    결론적으로 pthread_cleanup_push를 통하여 callback 함수를 등록하면 thread가 종료될 때 등록된 callback 함수를 호출하여 자원을 반환  할 수 있다.  


    추가로, pthread_cleanup_push 는 스택형식으로 관리 되어 여러개의 함수를 등록할 수 있고 thread가 종료되면 제일 마지막에 등록된 함수부터 자동으로 호출된다. 또한 pthread_cleanup_pop 함수를 통해 등록된 함수들을 스택 제일 마지막에 있는 함수부터 등록 해제 할 수 있다.


    참고사항으로 pthread_cleanup_push와 pop은 함께 사용해야 한다. 

    예를 들어,  아래 예제 함수와 같이 함수내에 두개가 꼭 쌍으로 있어야 한다.

    void start_thread(void* arg)
    {
       pthread_cleanup_push(cleanup_handler, NULL);
       pthread_cleanup_pop(0);
    }
    



    아래는  full 예제이다.
     

    #include <stdio.h>
    #include <pthread.h>
    
    void cleanup_handler(void *arg)
    {
      printf("cleanup_thread\n");
      return;
    }
    
    void cleanup_handler2(void *arg)
    {
      printf("cleanup_thread2\n");
      return;
    }
    void* start_new_thread(void *arg)
    {
      printf("start new thread ...\n");
      pthread_cleanup_push(cleanup_handler, NULL);
      pthread_cleanup_push(cleanup_handler2, NULL);
    
      sleep(3);
    
      printf("end new thread...\n");
    
      pthread_cleanup_pop(0);
      pthread_cleanup_pop(0);
      return NULL;
    }
    int main()
    {
      pthread_t thread;
      int ret;
      printf("start main thread....\n");
    
      if( pthread_create(&thread, NULL, start_new_thread, NULL ) != 0 )
        return 1;
    
      sleep(1);
    
      /* cancel!! */
      pthread_cancel(thread);
    
      pthread_join(thread, (void**)&ret);
    
      printf("end main thread....\n");
      return 0;
    }
    


    위의 코드를 실행하면, 나중에 등록한 cleanup_thread2가 먼저 호출되고 cleanup_thread가 호출되는 것을 알 수 있습니다.

    start main thread....
    start new thread ...
    cleanup_thread2
    cleanup_thread
    end main thread....

     


    반응형

    댓글

Designed by Tistory.