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