信道 - Rust By Example
Description: Rust by Example (RBE) is a collection of runnable examples that illustrate various Rust concepts and standard libraries.

## Keyboard shortcuts

Press `←` or `→` to navigate between chapters

Press `S` or `/` to search in the book

Press `?` to show this help

Press `Esc` to hide this help

# 信道

Rust 提供异步通道（`channels`）用于线程间通信。通道允许信息在两个端点之间单向流动：发送端（`Sender`）和接收端（`Receiver`）。

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

    static NTHREADS: i32 = 3;

    fn main() {
        // 通道有两个端点：`Sender<T>` 和 `Receiver<T>`，
        // 其中 `T` 是要传输的消息类型
        // （此处的类型注解是多余的）
        let (tx, rx): (Sender<i32>, Receiver<i32>) = mpsc::channel();
        let mut children = Vec::new();

        for id in 0..NTHREADS {
            // 发送端可以被复制
            let thread_tx = tx.clone();

            // 每个线程将通过通道发送其 ID
            let child = thread::spawn(move || {
                // 线程获取 `thread_tx` 的所有权
                // 每个线程在通道中排队一条消息
                thread_tx.send(id).unwrap();

                // 发送是非阻塞操作，线程在发送消息后
                // 会立即继续执行
                println!("线程 {} 已完成", id);
            });

            children.push(child);
        }

        // 在这里收集所有消息
        let mut ids = Vec::with_capacity(NTHREADS as usize);
        for _ in 0..NTHREADS {
            // `recv` 方法从通道中获取一条消息
            // 如果没有可用消息，`recv` 将阻塞当前线程
            ids.push(rx.recv());
        }

        // 等待线程完成所有剩余工作
        for child in children {
            child.join().expect("糟糕！子线程发生了 panic");
        }

        // 显示消息发送的顺序
        println!("{:?}", ids);
    }