Thread Lifetime

스레드 종료 책임

스레드를 만들면 현재 흐름과 다른 흐름이 동시에 실행된다. join, detach, jthread 중 어떤 방식으로 끝을 책임질지 정하지 않으면 수명 버그가 먼저 난다.

01

공유 데이터 표시

스레드 함수가 참조하는 객체가 스레드 종료 전까지 살아 있는지 확인한다.

02

종료 경로 보장

예외 경로에서도 join이 호출되거나 jthread 소멸이 일어나도록 구조를 만든다.

03

실패 전달 설계

스레드 내부 예외는 자동으로 호출 스레드에 전달되지 않으므로 future나 로그 정책이 필요하다.

joinable
소멸 전 정리 필요 joinable thread가 소멸하면 terminate가 호출된다.
가장 먼저 확인한다.
std::ref
참조 전달 기본 인자 전달은 복사이므로 참조는 명시해야 한다.
수명 위험도 함께 생긴다.
jthread
RAII 스레드 소멸 시 stop 요청 후 join한다.
협력적 취소와 맞다.
detach
소유권 분리 작업 완료, 실패, 객체 수명을 추적하기 어렵다.
아주 좁게 사용한다.

수명 · 종료 · 예외 점검

수명 스레드가 지역 변수 참조를 들고 함수보다 오래 실행되지 않는가.
종료 모든 경로에서 join 또는 자동 join이 보장되는가.
예외 작업 실패가 조용히 terminate나 누락된 로그로 끝나지 않는가.

jthread

std::jthread worker([](std::stop_token token) {
    while (!token.stop_requested()) poll_once();
});