thread는 한정된 자원을 효율적으로 사용할 수 있는 기능이지만 잘 알고 다뤄야 합니다. 만약 저처럼 좀비 thread가 있을 수 있을까?라고 생각하는 사람이 있다면 아래글을 참고 부탁 드립니다.
일반적으로는 zombie thread는 생성되지 못한다.
zombie thread는 생길 수 없다. thread는 메인스레드나 프로세스가 종료가 되면 자동으로 종료되기 때문이다. -끝
그럼 zombie thread가 생성되는 경우는?
스레드 커널객체에 참조계수(usage count)가 있다.
만약 thread 하나가 생성되면 usage count 가 2가 된다. (새로 생성한 thread + 주 thread) 이때 새로 생성한 thread를 종료하지 않고 주 thread가 종료되면 OS가 자동으로 모든 핸들을 닫아 주기에 zombie thread가 생성될 수 없지만
만약 주 thread가 종료되지 않은 상태에서 새로 생성한 thread를 detach() (C는 CloseHandle(h))를 하지 않으면 주 thread 가 종료되기 전까지는 zombie thread가 될 수 있다. 실제로 전원 off 전 혹은 sleep이 들어가기 전까지 프로세스가 살아 있어야 하는 경우가 있기에 이럴 때는 zombie thread로 리소스 낭비가 일어날 수 있다.
'핸들 개체를 닫는다'는 의미는?
detach() (C는 CloseHandle(h))를 단어 뜻 그대로 열려있는 핸들 개체를 닫는 역할을 한다.
핸들 개체를 닫을 때 참조계수가 차감이 되며 이 참조계수가 0이 되면 Thread가 파괴가 되지만, 주 thread 가 있기에 핸들 개체를 닫는다고 즉시 Thread가 종료되지는 않는다. 그렇다고 thread는 운영체제의 자원을 사용하고 프로그램에서는 직접적으로 운영체제의 자원을 접근할 수 없지만 (그래서 thread에 직접적인 접근을 할 수 없다.) 핸들을 통해서 접근을 허용하고 있기에 무조건 빨리 핸들 개체를 닫아서도 안된다.
그리고 만약 핸들 개체를 닫지 않은 상태에서 thread를 강제 종료를 하면 자원 leak 이 생기기에 핸들 개체를 닫는 처리는 잘해야 한다.
'L C++ > Concurrency' 카테고리의 다른 글
[Concurrency] 주요 기능 member type / class / functions 정리 (0) | 2023.08.01 |
---|---|
[Concurrency] 인자와 callable object (0) | 2023.07.24 |
[Concurrency] this_thread 특징 (0) | 2023.07.11 |
[Utilities] thread를 잘 사용하기 위한 std::reference_wrapper (std::ref) (활용 예시 추가) (0) | 2023.05.28 |
[Utilities] std::reference_wrapper (std::ref) : thread를 잘 사용하기 위해 필요한 템플릿 클래스 (0) | 2023.05.28 |