面试题答案
一键面试- 实现思路:
- 使用
Arc
(原子引用计数)来实现多个线程之间的数据共享,Arc
允许在多个线程间共享数据。 - 使用
Mutex
(互斥锁)来保护共享的数据,确保同一时间只有一个线程可以访问Vec
。Mutex
提供了一种机制,通过锁定和解锁来控制对共享数据的访问,避免数据竞争。
- 使用
- 示例代码:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let shared_vec = Arc::new(Mutex::new(vec![1, 2, 3, 4, 5]));
let mut handles = vec![];
for _ in 0..3 {
let clone = Arc::clone(&shared_vec);
let handle = thread::spawn(move || {
let lock = clone.lock().unwrap();
for num in &*lock {
println!("Thread saw number: {}", num);
}
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
在上述代码中:
- 首先创建了一个
Arc<Mutex<Vec<i32>>>
类型的shared_vec
,Arc
用于线程间共享,Mutex
用于保护Vec
。 - 在每个线程中,通过
clone
方法克隆Arc
,并使用lock
方法获取锁(如果锁可用),unwrap
用于在获取锁失败时直接使程序崩溃(实际应用中可以更优雅地处理错误)。获取锁后,就可以安全地访问Vec
中的数据了。 - 最后,主线程等待所有子线程完成。