面试题答案
一键面试示例代码
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个包含整数的Arc<Mutex<i32>>
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
// 克隆Arc
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
// 锁定Mutex以获取对数据的可变引用
let mut num = data.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 打印最终结果
println!("Final value: {}", *shared_data.lock().unwrap());
}
Arc的作用
Arc
即原子引用计数(Atomic Reference Counting),它允许在多个线程间共享数据。Arc
内部维护一个引用计数,每当Arc
被克隆(通过clone
方法)时,引用计数增加;当Arc
离开作用域时,引用计数减少。当引用计数为0时,其所指向的数据被释放。Arc
提供了一种线程安全的方式来共享数据,使得多个线程可以同时持有对同一个数据结构的引用。
Mutex的作用
Mutex
即互斥锁(Mutual Exclusion),它用于保护共享数据,确保在同一时间只有一个线程可以访问该数据。通过调用lock
方法来获取锁,如果锁已经被其他线程持有,调用线程会被阻塞,直到锁被释放。一旦获得锁,线程可以对受保护的数据进行修改,完成操作后,锁会自动释放(当lock
返回的MutexGuard
离开作用域时)。这样可以避免多个线程同时修改数据导致的数据竞争问题,从而实现线程安全。