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은 메인 스레드가 그 작업의 끝을 기다리게 합니다. 둘은 서로 다른 안전 지점을 맡습니다.