面试题答案
一键面试Arc(原子引用计数)的作用
Arc 用于在多个线程间共享数据的所有权。它通过原子引用计数机制,确保只有当最后一个指向数据的引用被释放时,数据才会被销毁。这使得数据可以安全地在多个线程间传递,实现共享所有权。
Mutex(互斥锁)的作用
Mutex 用于保护共享数据,确保在同一时间只有一个线程可以访问数据。它通过互斥访问机制,防止多个线程同时修改共享数据,从而避免数据竞争和不一致问题,实现并发安全。
代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个 Arc 包裹的 Mutex,内部包含一个 i32 类型的数据
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
// 克隆 Arc
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
// 尝试获取 Mutex 的锁
let mut num = data_clone.lock().unwrap();
// 修改数据
*num += 1;
});
handles.push(handle);
}
// 等待所有线程完成
for handle in handles {
handle.join().unwrap();
}
// 打印最终结果
println!("Final value: {}", *data.lock().unwrap());
}
在上述代码中,我们首先创建了一个 Arc<Mutex<i32>>
,然后在 10 个线程中尝试获取 Mutex
的锁并修改内部数据。通过 Arc
实现数据在多个线程间的共享所有权,通过 Mutex
确保同一时间只有一个线程可以修改数据,从而实现了安全的多线程数据共享。