MST
星途 面试题库

面试题:Rust中实现简单并发计算案例分析

请使用Rust编写一个并发程序,该程序创建两个线程,一个线程计算1到100的整数之和,另一个线程计算1到100的偶数之和,最后主线程等待两个线程完成并打印出结果。请详细说明你对线程同步机制的选择及原因。
22.0万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

fn main() {
    let sum_result = Arc::new(Mutex::new(0));
    let even_sum_result = Arc::new(Mutex::new(0));

    let sum_result_clone = sum_result.clone();
    let handle1 = thread::spawn(move || {
        let mut sum = 0;
        for i in 1..=100 {
            sum += i;
        }
        *sum_result_clone.lock().unwrap() = sum;
    });

    let even_sum_result_clone = even_sum_result.clone();
    let handle2 = thread::spawn(move || {
        let mut even_sum = 0;
        for i in (1..=100).filter(|&x| x % 2 == 0) {
            even_sum += i;
        }
        *even_sum_result_clone.lock().unwrap() = even_sum;
    });

    handle1.join().unwrap();
    handle2.join().unwrap();

    let sum = sum_result.lock().unwrap();
    let even_sum = even_sum_result.lock().unwrap();

    println!("1到100的整数之和: {}", sum);
    println!("1到100的偶数之和: {}", even_sum);
}

线程同步机制选择及原因

  1. 选择Arc<Mutex<T>>
    • ArcArc(原子引用计数)用于在多个线程间共享数据。因为我们需要在不同线程间访问和修改计算结果,Arc允许我们在多个线程中持有数据的共享引用。
    • MutexMutex(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问和修改数据。在这里,Mutex确保了不同线程对sum_resulteven_sum_result的访问是线程安全的,避免了数据竞争问题。如果没有Mutex,多个线程同时访问和修改这些变量会导致未定义行为。

通过Arc<Mutex<T>>的组合,我们实现了线程间安全的数据共享和修改,确保了并发程序的正确性。