thread::spawn(|| ... v ...)
println!에는 참조만 필요하므로 클로저가
v를 빌리려 합니다.
move는 새 스레드가 빌린 값을 들고 떠나지 못하게 한다
생성된 스레드가 언제 실행될지는 운영 체제가 정합니다. 그래서
v를 참조로 캡처하는 기본 추론은 메인 스레드의
drop(v) 가능성과 충돌합니다.
thread::spawn(|| ... v ...)
println!에는 참조만 필요하므로 클로저가
v를 빌리려 합니다.
새 스레드가 늦게 실행되는 동안 메인 스레드가 끝나거나
drop(v)를 호출하면 참조가 무효가 됩니다.
move가 허용하는 경로thread::spawn(move || ... v ...)
v가 클로저 환경으로 이동하므로 생성된 스레드가
자신이 쓸 값을 직접 소유합니다.
drop(v) 같은 후속 사용은 E0382로 막혀, 소유권이 두
곳에서 동시에 쓰이지 않습니다.
move는 생성된 스레드가 유효한 값을 소유하게 만들고,
JoinHandle::join은 메인 스레드가 그 작업의 끝을 기다리게
합니다. 둘은 서로 다른 안전 지점을 맡습니다.