thread traits

Send와 Sync는 이동 가능한가와 공유 가능한가를 따로 묻는다

스레드 경계에서 소유권을 옮기는 질문은 Send, 여러 스레드가 참조를 나눠 갖는 질문은 Sync가 담당한다.
짧은 판정 Rc가 막히면 단일 스레드 가정이 깨진 것이고, Arc와 동기화 타입은 공유 경계를 명시한다.
Send와 Sync 경계 점검표
대상 경계 질문 통과 감각 주의 신호
Send 값의 소유권을 다른 스레드로 옮겨도 되는가. 대부분의 소유 타입은 이동 가능하다. 비원자적 내부 상태가 함께 넘어간다.
Sync 여러 스레드가 같은 값을 참조해도 되는가. 불변 공유가 안전하면 참조를 나눌 수 있다. 내부 가변성이 동기화 없이 열린다.
Rc<T> 참조 카운트 갱신이 스레드 안전한가. 단일 스레드 안에서는 가볍고 충분하다. SendSync에서 제외된다.
Arc<Mutex<T>> 소유 핸들과 내부 변경이 함께 보호되는가. Arc는 공유 소유, Mutex는 직렬화다. 잠금 범위가 커져 교착과 병목이 생긴다.
tokio::spawn future가 워커 스레드 사이를 이동할 수 있는가. 대개 Send future가 요구된다. 비 Send 값이 await 지점을 넘어 살아남는다.
Move boundary 스레드로 값이 넘어가면 Send 질문이 먼저 나온다.
Shared ref 참조를 여러 스레드가 나누면 Sync 질문이 나온다.
Unsafe impl 직접 구현은 내부 불변식을 사람이 증명해야 하는 영역이다.
Error reading 컴파일 에러는 어떤 경계를 넘는지 찾으면 방향이 빨리 잡힌다.