面试题答案
一键面试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);
}
线程同步机制选择及原因
- 选择
Arc<Mutex<T>>
:Arc
:Arc
(原子引用计数)用于在多个线程间共享数据。因为我们需要在不同线程间访问和修改计算结果,Arc
允许我们在多个线程中持有数据的共享引用。Mutex
:Mutex
(互斥锁)用于保护共享数据,确保同一时间只有一个线程可以访问和修改数据。在这里,Mutex
确保了不同线程对sum_result
和even_sum_result
的访问是线程安全的,避免了数据竞争问题。如果没有Mutex
,多个线程同时访问和修改这些变量会导致未定义行为。
通过Arc<Mutex<T>>
的组合,我们实现了线程间安全的数据共享和修改,确保了并发程序的正确性。