面试题答案
一键面试基本步骤
- 创建通道:使用
std::sync::mpsc::channel
函数创建一个通道,该函数返回一个元组,包含发送端(Sender
)和接收端(Receiver
)。 - 生产者逻辑:在一个线程中,通过发送端(
Sender
)使用send
方法向通道发送数据。 - 消费者逻辑:在另一个线程中,通过接收端(
Receiver
)使用recv
方法从通道接收数据。 - 处理通道关闭:当生产者完成数据发送后,关闭发送端,此时接收端在没有数据时,
recv
会返回Err
,以此判断通道已关闭。 - 错误处理:
send
和recv
方法都可能返回错误,需要进行适当处理。send
错误可能因为通道已关闭,recv
错误可能因为通道关闭且无数据。
示例代码
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建通道
let (tx, rx) = mpsc::channel();
// 生产者线程
thread::spawn(move || {
for i in 0..5 {
match tx.send(i) {
Ok(_) => println!("Sent: {}", i),
Err(e) => println!("Send error: {}", e),
}
}
// 关闭发送端
drop(tx);
});
// 消费者线程
thread::spawn(move || {
while let Ok(data) = rx.recv() {
println!("Received: {}", data);
}
println!("Channel is closed");
});
// 主线程等待一会,确保子线程有时间执行
thread::sleep(std::time::Duration::from_secs(2));
}
通道关闭处理
在生产者完成数据发送后,通过drop(tx)
手动关闭发送端。消费者通过while let Ok(data) = rx.recv()
循环接收数据,当通道关闭且无数据时,rx.recv()
返回Err
,循环结束,消费者得知通道已关闭。
错误处理
在生产者中,tx.send(i)
返回Result
,通过match
语句处理Err
情况,打印错误信息。在消费者中,rx.recv()
同样返回Result
,通过while let Ok(data)
处理Ok
情况,循环接收数据,当遇到Err
时,跳出循环,可进行相应处理,如打印通道关闭信息。