MST
星途 面试题库

面试题:Rust并发编程中常见设计模式之生产者 - 消费者模式的实现

请用Rust语言实现一个简单的生产者 - 消费者模式,要求生产者线程不断生成数字并发送给消费者线程,消费者线程接收并打印这些数字。同时,需要处理好线程同步和资源竞争问题,可使用标准库中的相关同步原语。
26.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::{Arc, Mutex};
use std::thread;
use std::sync::mpsc::{channel, Sender, Receiver};

fn main() {
    let (tx, rx): (Sender<i32>, Receiver<i32>) = channel();

    let producer = thread::spawn(move || {
        for i in 0..10 {
            tx.send(i).unwrap();
            thread::sleep(std::time::Duration::from_millis(100));
        }
    });

    let consumer = thread::spawn(move || {
        for num in rx {
            println!("Received: {}", num);
        }
    });

    producer.join().unwrap();
    drop(tx);
    consumer.join().unwrap();
}
  1. 通道创建
    • 使用std::sync::mpsc::channel创建一个通道,tx是发送端,rx是接收端。mpsc代表多生产者单消费者。这里虽然只有一个生产者,但mpsc通道很适合这种基本的生产者 - 消费者模型。
  2. 生产者线程
    • thread::spawn创建一个新线程,在这个线程中,通过tx.send(i)将数字i发送到通道中。每发送一个数字后,线程睡眠100毫秒,模拟一些生产工作。
  3. 消费者线程
    • 同样使用thread::spawn创建一个新线程,在这个线程中,通过for num in rx循环从通道中接收数字并打印。这里rx实现了Iterator trait,当通道关闭(发送端tx被丢弃)时,循环会结束。
  4. 线程等待
    • 使用producer.join().unwrap()consumer.join().unwrap()等待两个线程完成。在等待生产者线程完成后,显式地丢弃发送端tx,这样消费者线程的接收循环会终止。