boundary questions

스레드 경계마다 이동과 공유를 따로 묻는다

SendSync는 외울 표라기보다, 값이 경계를 넘는 순간 컴파일러가 던지는 두 가지 질문입니다.

코드를 읽을 때의 체크 순서

move

thread::spawn(move || ...)

클로저 안으로 들어간 값은 새 스레드로 이동하므로 Send여야 합니다.

share

&T를 나눠 갖기

불변 참조 자체를 다른 스레드로 보낼 수 있으면 TSync입니다.

async

tokio::spawn

여러 워커 사이를 오갈 수 있는 태스크는 보통 Send future여야 합니다.

unsafe

직접 구현

자동 판정이 안 되면 내부 불변식을 사람이 증명해야 하므로 unsafe 영역입니다.

대표 타입을 경계 질문으로 보기

owned data

String

값 자체를 옮기는 데 적합해 대부분의 기본 조합과 함께 Send입니다.

single thread

Rc<T>

참조 카운트가 원자적이지 않아 SendSync에서 제외됩니다.

shared state

Arc<Mutex<T>>

Arc는 소유 핸들을 나누고 Mutex는 내부 변경을 직렬화합니다.

interior

RefCell<T>

단일 스레드 내부 가변성에는 좋지만 공유 참조 기준인 Sync에는 맞지 않습니다.

설계 감각

채널은 값을 옮기는 쪽이라 Send를 주로 드러내고, 공유 상태는 참조를 나누는 쪽이라 Sync를 함께 드러냅니다. 어떤 경계를 넘는지 먼저 보면 컴파일러 에러의 방향도 빨리 읽힙니다.