Rust 与通道的跨线程通信

示例

通道可用于将数据从一个线程发送到另一线程。下面是一个简单的生产者-消费者系统的示例,其中主线程产生值0、1,...,9,而生成的线程将其打印出来:

use std::thread;
use std::sync::mpsc::channel;

fn main() {
    // 创建一个具有发送端(tx)和接收端(rx)的通道。
    let (tx, rx) = channel();

    // 生成一个新线程,并将接收端移到该线程中。
    let join_handle = thread::spawn(move || {
        // 继续循环接收,直到丢弃TX!
        while let Ok(n) = rx.recv() { // 注意:`recv()`总是阻塞
            println!("Received {}", n);
        }
    });

    // 注意:在这里使用`rx`会产生编译错误,因为
    // 移动到生成的线程中。

    //将一些值发送到生成的线程。`unwrap()`仅在
    // 接收端在可以缓冲之前被丢弃。
    for i in 0..10 {
        tx.send(i).unwrap(); // 注意:`send()`永远不会阻塞
    }

    // 删除`tx`,以便`rx.recv()`返回`Err(_)`。
    drop(tx);

    // 等待生成的线程完成。
    join_handle.join().unwrap();
}