MST

星途 面试题库

面试题:Rust Option类型在复杂数据结构与并发场景下的应用

假设有一个包含多个 `Option<Vec<u32>>` 的复杂数据结构(例如 `Vec<Option<Vec<u32>>>`),每个 `Option` 可能为 `None`,表示数据缺失。如果 `Option` 为 `Some`,其内部的 `Vec<u32>` 代表一组数字。现在要编写一个多线程程序,每个线程负责处理数据结构中的一部分(例如按索引分配任务),将所有 `Some` 中的 `Vec<u32>` 里的数字进行求和操作,并且要高效处理 `None` 情况以避免线程等待无效数据。请给出完整的Rust代码实现,包括线程创建、同步机制以及对 `Option` 类型的处理。
44.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let data: Vec<Option<Vec<u32>>> = vec![
        Some(vec![1, 2, 3]),
        None,
        Some(vec![4, 5]),
    ];

    let num_threads = 2;
    let data_chunks: Vec<&[Option<Vec<u32>>]> = data.chunks((data.len() + num_threads - 1) / num_threads).collect();

    let sum = Arc::new(Mutex::new(0));
    let mut handles = Vec::new();

    for chunk in data_chunks {
        let sum_clone = Arc::clone(&sum);
        let handle = thread::spawn(move || {
            for option in chunk {
                if let Some(nums) = option {
                    let mut local_sum = 0;
                    for num in nums {
                        local_sum += num;
                    }
                    let mut guard = sum_clone.lock().unwrap();
                    *guard += local_sum;
                }
            }
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    let result = sum.lock().unwrap();
    println!("Total sum: {}", *result);
}