스레드가 협력하는 한 방법은 메모리 공유 대신 메시지를 패싱 하는 거야. Rust 의 표준 채널 — mpsc — 은 한 스레드가 다른 스레드로 값을 보내게 해, 가는 길에 소유권이 이전되면서.
mpsc: 여러 producer, 단일 consumer
mpsc::channel() 은 (Sender, Receiver) 쌍을 반환해. Sender 를 든 스레드가 .send(value) 를 부르고; Receiver 를 든 스레드가 .recv() (블로킹) 를 부르거나 순회해. 'mpsc' = 여러 sender, 한 receiver: Sender 를 clone 해서 여러 스레드에서 한 receiver 를 먹일 수 있어.
send 는 소유권을 이전해
값을 send 하면 소유권이 채널로 그다음 receiver 로 move 해 — sender 는 그 뒤 못 써. 또 그 move 시맨틱이고, 그게 채널이 race-free 인 이유야: 값은 한 번에 한쪽만 소유. 공유 가변 상태가 없으면 락도 데이터 레이스도 없어.
'메모리를 공유해 소통하지 말고; 소통해서 메모리를 공유하라.' 채널은 스레드 간 소유권을 move 해서, 어느 순간이든 한 스레드만 값을 들어. 락보다 추론하기 종종 더 단순해 — 보호할 공유 상태 없이, 그냥 한 방향으로 흐르는 값들.
채널 vs 공유 상태
유효한 두 스타일: 메시지 패싱 (채널, 이 레슨) 과 공유 상태 (Arc<Mutex>, 다음 레슨). 채널은 파이프라인이랑 producer/consumer 셋업에 맞아 — 데이터가 한 방향으로 흘러. 공유 상태는 여러 스레드가 한 구조를 읽고 갱신하는 데 맞아. 진짜 프로그램은 둘 다 섞어; 어느 게 문제에 맞는지 아는 게 기술이야.