MST

星途 面试题库

面试题:Rust中利用并行迭代器实现高效数组遍历

假设有一个较大的Rust数组,存储了一系列数字。请使用并行迭代器对数组元素进行操作,计算所有元素的乘积,并展示如何处理可能出现的并发问题,给出完整且可运行的代码示例。
35.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

fn main() {
    let numbers = (1..100).collect::<Vec<i32>>();
    let product = Arc::new(Mutex::new(1));
    let num_threads = num_cpus::get();
    let part_size = (numbers.len() as f64 / num_threads as f64).ceil() as usize;
    let mut handles = Vec::new();

    for i in 0..num_threads {
        let start = i * part_size;
        let end = if i == num_threads - 1 { numbers.len() } else { (i + 1) * part_size };
        let part = numbers[start..end].to_vec();
        let product_clone = product.clone();

        let handle = thread::spawn(move || {
            let local_product = part.iter().product::<i32>();
            let mut guard = product_clone.lock().unwrap();
            *guard *= local_product;
        });
        handles.push(handle);
    }

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

    let final_product = *product.lock().unwrap();
    println!("The product of all elements is: {}", final_product);
}

在上述代码中:

  1. 数组准备let numbers = (1..100).collect::<Vec<i32>>(); 创建了一个包含1到99的数组。
  2. 乘积变量let product = Arc::new(Mutex::new(1)); 使用 ArcMutex 来确保多线程安全地更新乘积结果。Arc 用于在多个线程间共享数据,Mutex 用于互斥访问。
  3. 线程划分:根据CPU核心数 num_threads 将数组划分为多个部分 part,每个线程处理一部分数据。
  4. 并行计算:每个线程计算自己部分的乘积 local_product,然后通过锁 guard 安全地更新全局的 product
  5. 结果获取:等待所有线程完成计算后,从 product 中获取最终的乘积结果并打印。