面试题答案
一键面试- 设计思路:
- 使用
mpsc::channel
创建一个多生产者 - 多消费者通道。 - 为了确保特定消费顺序,可以在发送的数据结构中添加一个表示顺序的字段,比如
id
。 - 消费者接收到数据后,根据这个
id
进行排序消费。 - 为保证并发安全,Rust的通道本身就是线程安全的,无需额外的锁机制(在简单场景下)。
- 使用
- 代码示例:
use std::sync::mpsc;
use std::thread;
fn main() {
// 创建一个多生产者 - 多消费者通道
let (tx, rx) = mpsc::channel();
// 多个生产者线程
let mut handles = vec![];
for i in 0..3 {
let tx = tx.clone();
let handle = thread::spawn(move || {
for j in 0..3 {
// 发送带有顺序标识的数据
tx.send((i * 3 + j, format!("data from producer {}", i))).unwrap();
}
});
handles.push(handle);
}
// 多个消费者线程
for _ in 0..3 {
let rx = rx.clone();
thread::spawn(move || {
let mut data: Vec<(i32, String)> = vec![];
for _ in 0..3 {
// 接收数据
let received = rx.recv().unwrap();
data.push(received);
}
// 根据id排序
data.sort_by_key(|&(id, _)| id);
for (_, item) in data {
println!("Consumed: {}", item);
}
});
}
for handle in handles {
handle.join().unwrap();
}
}
在这个示例中:
- 生产者线程生成带有
id
的元组数据,id
是按照一定顺序生成的。 - 消费者线程接收数据后,先将数据收集到一个
Vec
中,然后根据id
进行排序,最后按序消费数据。这样就确保了每个消费者按照特定顺序消费数据,并且Rust的通道机制保证了并发安全。