thread safety
spawn은 새 실행 흐름을 만들고 move와 join이 수명 경계를 정한다
스레드는 실행 순서가 비결정적이므로, 클로저가 캡처한 값의 소유권과 메인 스레드가 기다릴 시점을 명확히 해야 한다.
spawn
새 OS 스레드에서 클로저 코드를 실행한다.
move
클로저가 필요한 값을 소유하도록 캡처한다.
join
메인 스레드가 생성된 스레드 종료를 기다린다.
main
작업 분리 결정
동시에 실행할 코드를 클로저로 묶는다.
spawn
새 스레드 시작
출력 순서는 스케줄러에 따라 매번 달라질 수 있다.
move
캡처 값 수명 확보
스레드가 오래 살아도 빌린 값이 먼저 사라지지 않게 한다.
join
끝까지 기다림
메인이 먼저 종료되어 생성 스레드가 중간에 끊기지 않게 한다.
문제 원인 Rust에서 보는 기준
경합 조건 동시에 같은 데이터나 자원에 접근한다. 소유권, Mutex, 채널로 접근 방식을 명확히 한다.
조기 종료 메인 스레드가 생성 스레드를 기다리지 않는다. JoinHandle을 보관하고 join으로 종료를 확인한다.
수명 오류 스레드가 참조한 값보다 오래 살아갈 수 있다. move 클로저로 필요한 값을 스레드에 넘긴다.
순서는 보장하지 않음
동시 출력 순서를 로직의 근거로 삼으면 안 된다.
소유권 먼저
스레드로 넘어가는 값은 수명과 이동 여부를 먼저 정한다.
기다림 명시
필요한 작업은 join으로 끝났음을 확인한다.