面试题答案
一键面试实现思路
- 创建通道:使用
std::sync::mpsc
模块中的channel
函数创建一个多生产者 - 单消费者的通道。mpsc
代表“多个生产者,单个消费者”。 - 生产者发送数据:每个生产者线程获取通道的发送端,并通过
send
方法向通道发送数据。 - 消费者接收数据:消费者线程获取通道的接收端,通过
recv
方法从通道接收数据。
关键代码片段
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建通道
let (tx, rx) = mpsc::channel();
// 生产者线程
let num_producers = 3;
let producer_handles: Vec<_> = (0..num_producers).map(|i| {
let tx_clone = tx.clone();
thread::spawn(move || {
for j in 0..3 {
let data = format!("Producer {}: Message {}", i, j);
tx_clone.send(data).unwrap();
}
})
}).collect();
// 消费者线程
let consumer_handle = thread::spawn(move || {
for received in rx {
println!("Received: {}", received);
}
});
// 等待所有生产者线程完成
for handle in producer_handles {
handle.join().unwrap();
}
// 手动关闭发送端,通知消费者没有更多数据
drop(tx);
// 等待消费者线程完成
consumer_handle.join().unwrap();
}
在上述代码中:
let (tx, rx) = mpsc::channel();
创建了一个通道,tx
是发送端,rx
是接收端。- 生产者线程通过克隆发送端
tx_clone
,并在循环中使用send
方法发送数据。 - 消费者线程通过
rx
接收数据,for received in rx
会阻塞等待数据,直到发送端关闭,此时循环结束。 - 手动
drop(tx)
关闭发送端,通知消费者没有更多数据。