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