[Thread] detach vs join

dandb3·2023년 2월 27일
0

이것저것 TMI

목록 보기
4/17

detach? join?

  • 스레드의 상태에는 detached 상태와 joinable 상태가 존재한다. (다른 것도 있을 수 있음)
  • 스레드 생성 시에 default 설정으로 joinable하게 생성되고, attribute를 추가해 주면 detach로도 생성이 가능하다.
  • 또는 pthread_detach함수로 기존에 존재하던 스레드를 detached로 바꾸어 줄 수도 있다.

그래서 각각이 무슨 뜻인데?

  • 스레드를 생성하면 스레드와 관련된 자원이 할당된다.
  • 그 할당된 자원은 스레드가 terminate 되고 난 후에 할당 해제를 해주어야 한다.
  • 할당 해제를 해 주지 않으면 좀비 프로세스 처럼 자원을 낭비한 상태로 존재하게 된다.
  • 그 할당 해제를 해 주는 함수가 바로 pthread_join함수이다.
  • detached 스레드의 경우 pthread_join을 굳이 호출하지 않아도 스레드가 terminate 될 때에 할당 해제도 자동으로 진행시켜준다.
  • 그러면 detach와 join의 차이는 뭐임? 다른 게 없는 것 같은데?

detached와 join의 차이?

  • 그냥 detached가 알아서 할당을 해 주니까 만들 때에 detached로 만들고 냅두면 편한거 아님?
  • 이라고 생각할 수도 있지만, 아래의 코드를 보면 그 생각이 달라질 지도..?
int value = 0;
void myWorkerFunction(){value = 1;}

int main()
{
   std::thread t(myWorkerFunction);
   t.detach();
   std::cout << value << std::endl;
}
  • c++코드이긴 하나, 개념적으로는 다를 것이 없기 때문에 예시로 들었다.
  • 우선 첫 번째로 알아야 하는 것이, pthread_join 함수는 process에서의 waitpid함수와 동일하게 해당 스레드가 종료되기 전까지 block된 상태가 된다. 즉, 해당 스레드가 끝날 때 까지 기다려 주는 것이다.
  • 이를 알고 위 코드를 다시 보면,,
    1. 처음에 value 값이 0 으로 설정된다.
    2. 새로운 스레드 t가 만들어진다.
    3. t는 value 값을 1로 설정한다.
    4. t는 detached 상태였기 때문에 알아서 자원을 할당 해제한다.
    5. 그 후 value값(1) 을 출력한다..?
  • 인 줄 알았지만, 사실 메인 스레드는 t의 termination을 기다려 주지 않는다. 즉, 우리가 바라던 결과인 1이 출력되지 않을 수도 있다. (race condition)
  • 이 때, t.detach 대신에 join을 사용한다면..?
  • t 스레드가 종료될 때 까지 기다려 주기 때문에 race condition이 발생하지 않고 정상적으로 1이 잘 출력된다.

헷갈릴 수 있는 부분

  • detach라고 그래서 메인 스레드로 부터 떨어진 것이라고 생각해서 독립적인 존재라고 생각할 수도 있는데, 실제로는 그렇지 않다.
  • detach는 스레드가 종료될 '때' 시스템의 behavior를 변화(자원을 알아서 할당 해제시킴)시키는 것이지, 스레드가 종료되는 '조건'을 변화시키는 것이 아니다.
  • 그러므로, 다른 스레드에서 exit(3)을 호출한다고 할 지라도, 일반적인 경우와 마찬가지로 같이 종료되게 된다.

의문의 문장(이었던 것)

  • Either pthread_join(3) or pthread_detach() should be called for
    each thread that an application creates, so that system resources
    for the thread can be released. (But note that the resources of
    any threads for which one of these actions has not been done will
    be freed when the process terminates.) -from manual of pthread_detach(3)
  • 아.. 의문인 줄 알았지만 의문이 아니었다. 제일 마지막 문장의 process를 thread로 잘못 읽음.
  • 그래도 배울 수 있는 점 : 할당 해제하지 않은 스레드의 자원들도 속해있는 프로세스가 종료되면 할당 해제를 해 준다.

약간 헷갈리는(?) 부분

  • detached 상태는 단순히 스레드의 종료 시에 시스템이 어떻게 동작하는지만 달라지게 하는 상태이고, 다른 행동은 하지 않는다.. 라고 메뉴얼에 쓰여있기는 함.

참고자료

https://stackoverflow.com/questions/45716305/threadjoin-vs-detach
https://man7.org/linux/man-pages/man3/pthread_join.3.html

profile
공부 내용 저장소

0개의 댓글