std::thread 생명주기

소유권이 남아 있으면 반드시 정리해야 한다

std::thread 객체는 실행 흐름을 소유할 수도 있고, 이미 비어 있을 수도 있습니다. 판단 질문은 소멸 시점에 joinable() 인지입니다.

상태 흐름

ownership
constructed 기본 생성 실행 흐름이 없으면 joinable() 은 false입니다.
joinable 실행 소유 함수와 인자로 생성되면 새 스레드를 소유합니다.
moved 소유권 이동 move 후 원본은 비고, 대상 객체가 join 또는 detach 책임을 집니다.
joined 완료 대기 join() 후에는 더 이상 joinable 상태가 아닙니다.
detached 분리 실행 detach() 후 객체는 비지만 스레드는 독립적으로 진행합니다.
결과가 필요함 부모 흐름이 완료를 기다려야 하면 join()을 호출합니다.
완전 독립 작업 공유 자원과 종료 순서를 보장할 수 있을 때만 detach()를 고려합니다.
그냥 소멸 joinable 상태로 소멸하면 소멸자가 std::terminate를 호출합니다.