marker traits

Send는 이동, Sync는 공유 참조를 판정한다

두 트레이트는 메서드가 없는 표식이지만, thread::spawn과 공유 상태 타입이 값의 스레드 경계를 판단할 때 핵심 근거가 됩니다.

자동으로 따라오는 경우

구성 요소

필드가 모두 Send면 구조체도 대체로 Send

대부분의 기본 타입과 그 조합은 소유권을 다른 스레드로 옮길 수 있습니다.

공유 참조

&T: Send이면 T: Sync

불변 참조를 여러 스레드가 안전하게 나눌 수 있으면 타입 자체가 공유 참조에 적합합니다.

Arc

스레드 안전한 참조 카운팅

Arc<T>는 원자적으로 카운트를 바꾸므로 Rc<T> 대신 스레드 경계를 건널 수 있습니다.

컴파일러가 멈춰 세우는 경우

Rc

Rc<T>SendSync도 아님

참조 카운트 변경이 스레드 안전하지 않아 여러 스레드가 동시에 건드리면 카운트가 틀어질 수 있습니다.

RefCell

런타임 대여 검사는 스레드 안전하지 않음

RefCell<T> 계열은 단일 스레드 내부 가변성에는 좋지만 공유 스레드 기준에는 맞지 않습니다.

unsafe impl

직접 구현은 안전 불변식의 약속

컴파일러가 자동 판정하지 못하는 동시성 타입을 만들 때는 19장의 unsafe 코드 지식이 필요합니다.

장 전체와 연결

채널의 값 이동, Arc<Mutex<T>> 공유 상태, Tokio 태스크 이동은 모두 같은 질문으로 돌아옵니다. 이 값은 옮겨도 되는가, 이 참조는 나눠도 되는가를 타입이 먼저 답합니다.