信道
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); }