18.2 Channels

Rust가 제공하는 비동기식 채널(channels)은 쓰레드들 간의 통신을 위한 것이다. 채널로 허용되는 단방향 정보 흐름의 양 끝단은: SenderReceiver이다.

use std::sync::mpsc::{Sender, Receiver};
use std::sync::mpsc;
use std::thread;

static NTHREADS: i32 = 3;

fn main() {
    // 채널은 양 끝단을 갖는다: `Sender` 와 `Receiver`,
    // `T`는 전송될 메시지의 타입
    // (타입 주해는 필요치 않다)
    let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel();

    for id in 0..NTHREADS {
        // 수신종단은 복사될 수 있다. 
        let thread_tx = tx.clone();

        // 각 쓰레드는 채널을 통해 그들의 id를 보내게 된다.
        thread::spawn(move || {
            // 쓰레드는 `thread_tx`를 통해 소유권을 취한다.
            // 각 쓰레드는 채널에서 오는 메시지를 기다린다. 
            thread_tx.send(id).unwrap();

            // 보내기는 논-블로킹 동작이고, 쓰레드는 메시지를 보내지마자
            // 다음 수행으로 넘어갈 것이다. 
            println!("thread {} finished", id);
        });
    }

    // 여기서, 모든 메시지들이 수집된다. 
    let mut ids = Vec::with_capacity(NTHREADS as usize);
    for _ in 0..NTHREADS {
        // `recv` 메소드는 채널에서 메시지를 집어온다.
        // `recv` 는 현재 쓰레드가 메시지를 받지 못하면 블럭된다. 
        ids.push(rx.recv());
    }

    // 어떤 메시지가 보내졌는지를 통해 순서를 보자.
    println!("{:?}", ids);
}

results matching ""

    No results matching ""