C++ thread 수명

std::thread joinable 관리

스레드 생성은 쉽지만 객체 수명과 join/detach 정책을 놓치면 terminate나 데이터 레이스로 이어진다. 인자 전달, 참조 수명, 예외 경계까지 같이 설계한다.

01

함수와 인자

스레드 함수에 넘기는 값은 기본적으로 복사되며 참조는 std::ref가 필요하다.

수명 확인
02

실행 시작

std::thread 객체가 만들어지면 새 실행 흐름이 바로 시작된다.

생성 후 설정 불가
03

회수 결정

스코프 종료 전 join 또는 detach를 호출해야 destructor terminate를 피한다.

joinable 검사
04

예외 처리

스레드 함수 밖으로 예외가 새면 terminate되므로 내부에서 잡아 전달한다.

promise/future 후보
join
완료까지 대기 결과가 필요하거나 자원 수명을 부모가 관리할 때 안전하다.
deadlock
detach
독립 실행 스레드 객체와 실행을 분리하지만 참조한 외부 자원의 수명을 보장하기 어렵다.
거의 경계
jthread
RAII join과 stop_token C++20에서는 스코프 종료 시 join하고 취소 신호를 전달할 수 있다.
선호 후보
hardware
동시성 힌트 hardware_concurrency는 힌트일 뿐 실제 스레드 수 결정 근거로만 쓴다.
0 가능

joinable · 참조 인자 · 공유 상태 점검

joinable 모든 경로에서 joinable thread가 소멸되지 않는지 확인한다.
참조 인자 std::ref로 넘긴 대상이 스레드 종료 전까지 살아 있는지 본다.
공유 상태 여러 스레드가 같은 데이터에 접근하면 mutex나 atomic이 필요한지 검토한다.