MST

星途 面试题库

面试题:Rust 中如何实现控制台读写的基本并发处理

在Rust中,假设你需要从控制台读取数据,同时又要向控制台输出一些处理后的结果,并且希望这两个操作能并发执行。请简述你会用到哪些 Rust 的并发原语(如线程、通道等),并给出一个简单的代码框架示例,展示如何构建这种控制台读写并发处理的逻辑。
30.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 并发原语

    • 线程(std::thread:用于创建并发执行的任务。可以分别创建一个线程用于从控制台读取数据,另一个线程用于向控制台输出处理后的结果。
    • 通道(std::sync::mpsc:用于在两个线程之间传递数据。从控制台读取的数据通过通道发送给负责输出的线程。
  2. 代码框架示例

use std::sync::mpsc::{channel, Receiver, Sender};
use std::thread;

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

    // 读取线程
    thread::spawn(move || {
        loop {
            let mut input = String::new();
            std::io::stdin().read_line(&mut input).expect("Failed to read line");
            tx.send(input.trim().to_string()).expect("Failed to send data");
        }
    });

    // 输出线程
    thread::spawn(move || {
        for data in rx {
            // 这里可以对数据进行处理
            let processed_data = format!("Processed: {}", data);
            println!("{}", processed_data);
        }
    });

    // 主线程等待
    loop {
        thread::park();
    }
}

在上述代码中:

  • 首先创建了一个通道 (tx, rx)tx 用于发送数据,rx 用于接收数据。
  • 读取线程通过 std::io::stdin().read_line 从控制台读取数据,并通过 tx.send 将数据发送到通道。
  • 输出线程通过 rx 接收数据,对数据进行简单处理(这里只是添加了一个前缀),然后通过 println! 输出到控制台。
  • 主线程通过 thread::park() 保持程序运行,防止主线程退出导致整个程序提前结束。