pthread_create()를 사용해 생성된 스레드는 메인 스레드가 종료되면 함께 종료가 되고, 그 과정에서 메모리를 자동으로 회수하지 않는다.
그래서 pthread_join나 pthread_detach을 통해 스레드가 종료될 때 메모리를 회수해줘야 한다 !
두 함수 모두 스레드의 종료와 관련된 함수같은데 ... 🤔 어떤 점이 다른지, 어떤 함수를 써야할 지 궁금했다.
먼저, 스레드는 합류 가능 상태이거나 합류된 상태, 분리된 상태임을 알아야 한다. 여기서 말하는 합류는 join이 가능한 상태를 말한다.
pthread_join
- 대상 스레드를 호출 스레드에 합류시키고 대상 스레드가 종료할 때까지 기다린다.
- 가령, A pthread_join B 의 순서를 가지는 코드가 있다면 대상 스레드가 종료될 때까지 코드 B는 실행되지 않는다.
- 대상 스레드의 종료 상태를 알 수 있다.
- 함수 호출이 성공했다는 건, 대상 스레드가 종료됐다는 뜻이므로 호출 스레드에서 대상 스레드에 할당했던 메모리나 기타 자원 등을 해제할 수 있다.
pthread_detach
- 대상 스레드를 분리 상태로 만든다.
- 대상 스레드의 종료를 기다리지 않는다.
- 가령, A pthread_detach B 의 순서를 가지는 코드가 있다면 대상 스레드가 종료하던 말던 코드 B는 실행된다.
- 대상 스레드의 종료 상태를 알 수 없다.
- 종료 상태를 얻기 위해 대상 스레드를 합류시키는 것도 불가능하다.
- 대상 스레드가 종료될 때 시스템에서 자원을 알아서 해제해준다.
Philosophers 과제 같은 경우 시뮬레이션이 끝나면 프로그램이 종료되므로 (스레드들이 종료한 후에 할당된 자원들에 접근하지 않아도 되기 때문에 ...) detach를 써도 상관은 없다고 생각했는데, 시스템이 자원을 알아서 해제해준다는 말로 디펜스할 자신이 없어서 join을 사용했고 시뮬레이션 이후에 모든 자원들을 해제해주었다 !
( + pthread_join을 호출 중인 스레드가 취소되는 경우에는 대상 스레드가 계속 합류 가능 상태로 남는다. 이렇게 합류 가능한 (즉, 분리되지 않은) 스레드는 "좀비 스레드"가 된다. )
'42Seoul' 카테고리의 다른 글
[Philosophers] 🚨 usleep 함수의 문제점 ? (0) | 2023.05.09 |
---|---|
[Philosophers] 2. 스레드와 뮤텍스 (0) | 2023.04.14 |
[Philosophers] 1. Subject 이해와 허용 함수 정리 (3) | 2023.04.13 |