通道可用于将数据从一个线程发送到另一线程。下面是一个简单的生产者-消费者系统的示例,其中主线程产生值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();
}