thread::spawn

move와 스레드 소유권

생성된 스레드가 언제 실행될지는 운영 체제가 정합니다. 그래서 v를 참조로 캡처하는 기본 추론은 메인 스레드의 drop(v) 가능성과 충돌합니다.

빌린 캡처가 거절되는 경로

기본 추론

thread::spawn(|| ... v ...)

println!에는 참조만 필요하므로 클로저가 v를 빌리려 합니다.

E0373

스레드가 현재 함수보다 오래 살 수 있음

새 스레드가 늦게 실행되는 동안 메인 스레드가 끝나거나 drop(v)를 호출하면 참조가 무효가 됩니다.

move가 허용하는 경로

소유권 이동

thread::spawn(move || ... v ...)

v가 클로저 환경으로 이동하므로 생성된 스레드가 자신이 쓸 값을 직접 소유합니다.

메인 스레드

이동 뒤 다시 사용할 수 없음

drop(v) 같은 후속 사용은 E0382로 막혀, 소유권이 두 곳에서 동시에 쓰이지 않습니다.

구분해서 읽기

move는 생성된 스레드가 유효한 값을 소유하게 만들고, JoinHandle::join은 메인 스레드가 그 작업의 끝을 기다리게 합니다. 둘은 서로 다른 안전 지점을 맡습니다.