MST

星途 面试题库

面试题:Rust中如何在并发环境下处理错误以保证安全

在Rust的并发编程中,使用`thread::spawn`创建新线程,假设新线程执行的任务可能会返回`Result`类型的错误,如何正确捕获并处理这个错误,以确保整个并发程序的安全性和稳定性,请给出代码示例。
34.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::thread;
use std::sync::mpsc;
use std::io::{self, Write};

fn main() {
    let (sender, receiver) = mpsc::channel();

    let handle = thread::spawn(move || {
        let result = some_function_that_might_fail();
        if let Err(e) = result {
            sender.send(Err(e)).unwrap();
        } else {
            sender.send(Ok(result.unwrap())).unwrap();
        }
    });

    match receiver.recv() {
        Ok(Ok(data)) => println!("Success: {:?}", data),
        Ok(Err(e)) => println!("Error in thread: {:?}", e),
        Err(e) => println!("Error receiving result: {:?}", e),
    }

    handle.join().unwrap();
}

fn some_function_that_might_fail() -> Result<String, io::Error> {
    let mut input = String::new();
    io::stdout().write_all(b"Enter something: ").unwrap();
    io::stdin().read_line(&mut input)?;
    Ok(input.trim().to_string())
}

在上述代码中:

  1. 使用mpsc::channel创建了一个通道用于线程间通信。
  2. 在新线程中执行可能会返回错误的函数some_function_that_might_fail,如果函数执行失败,通过通道发送Err,如果成功则发送Ok
  3. 在主线程中通过receiver.recv()接收结果,并对结果进行匹配处理,分别处理成功和失败的情况。
  4. 最后通过handle.join()等待新线程执行结束,确保程序在新线程完成后才退出。