thread safety

스레드 사용 안전 흐름

새 스레드는 실행 순서가 보장되지 않는다. 안전한 사용은 값의 이동, 핸들 보관, 명시적 합류 지점을 분리해 읽는 데서 시작한다.

1

thread::spawn

클로저를 새 운영 체제 스레드에서 실행하도록 예약한다.

2

move 캡처

스레드가 쓸 값을 빌리지 않고 클로저 안으로 이동시킨다.

3

JoinHandle

생성된 스레드와 나중에 합류할 수 있는 소윳값을 보관한다.

4

join

현재 스레드를 멈추고 생성된 스레드가 끝날 때까지 기다린다.

보장되는 것과 보장되지 않는 것

checkpoints

조기 종료

메인 스레드가 끝나면 생성된 스레드도 끝까지 실행되지 못할 수 있다.

순서 보장 없음

스케줄링은 운영 체제가 결정하므로 출력이나 실행 순서는 매번 다를 수 있다.

공유 상태 위험

같은 값을 여러 스레드가 동시에 다루면 경합 조건과 수명 문제가 생길 수 있다.

OK

move로 수명 경계를 분명히 한다

클로저가 필요한 값을 소유하면 다른 스레드에서 무효 참조를 들고 출발하지 않는다.

WAIT

join으로 완료 시점을 분명히 한다

핸들을 저장하고 join을 호출해야 생성된 스레드가 끝났음을 확인할 수 있다.