std::ref lifetime

참조 전달은 “원본이 더 오래 사는가”부터 확인한다

std::ref는 복사를 막는 도구이지 수명을 늘리는 도구가 아닙니다. 원본 객체가 먼저 사라지면 스레드는 끊어진 참조를 보게 됩니다.

안전한 흐름 join before scope end
1
지역 변수 생성main scope 안에 value가 살아 있습니다.
2
std::ref 전달스레드가 value 원본을 참조합니다.
3
join으로 종료 대기스레드 접근이 끝난 뒤 scope가 닫힙니다.
위험한 흐름 dangling reference
1
지역 변수 참조 전달detach된 스레드가 value 주소를 기억합니다.
2
scope 먼저 종료value가 사라져도 스레드는 멈추지 않습니다.
3
늦은 접근정의되지 않은 동작으로 이어질 수 있습니다.
참조로 넘긴 객체는 “스레드가 마지막으로 접근하는 시점”까지 살아 있어야 합니다. detach와 지역 변수 참조 조합은 특히 피하는 편이 안전합니다.