SEND SYNC

Send/Sync 스레드 경계

Send는 소유권을 다른 스레드로 옮겨도 되는지, Sync는 여러 스레드가 공유 참조로 접근해도 되는지를 나타내며 Rc, Arc, Mutex 선택을 가른다.

01

소유 이동

thread::spawn으로 값을 넘길 때 타입이 Send여야 한다.

move closure
02

공유 필요

여러 스레드가 같은 데이터를 읽거나 바꾸려면 Sync와 내부 동기화가 필요하다.

shared access
03

포인터 선택

단일 스레드는 Rc, 다중 스레드는 Arc를 사용한다.

atomic refcount
04

가변성 보호

공유 가변 상태는 Mutex/RwLock/Atomic으로 동시 접근을 통제한다.

interior mutability
Rc<T>
Send/Sync 아님 참조 카운트 증가가 atomic이 아니므로 스레드 간 공유에 부적합하다.
single-thread only
Arc<T>
참조 카운트는 thread-safe T 자체가 Sync해야 안전하게 공유 읽기가 가능하다.
shared ownership
Arc<Mutex<T>>
공유 가변 상태 보호 락으로 한 번에 한 스레드만 T를 수정하게 만든다.
lock poisoning 고려
RefCell<T>
런타임 borrow check, thread-safe 아님 다중 스레드에서는 Mutex/RwLock이 역할을 대신한다.
not Sync

unsafe impl 전 질문

데이터 레이스 내부 포인터나 FFI 자원이 동시에 접근되어도 안전한지 증명해야 한다.
Drop 위치 다른 스레드에서 drop되어도 외부 자원 해제가 안전한지 확인한다.
대안 대부분은 unsafe impl보다 Arc, Mutex, channel로 설계를 바꾸는 편이 안전하다.