面试题答案
一键面试设计思路
- 使用
Mutex
或Arc<Mutex>
:Mutex
提供了互斥锁机制,确保同一时间只有一个线程可以访问被保护的数据。Arc<Mutex>
则用于在多个线程间共享数据,Arc
是原子引用计数类型,用于多线程环境下的数据共享。 - 内部可变性的模拟:将需要内部可变性的数据放在
Mutex
或Arc<Mutex>
内部,通过获取锁来访问和修改数据,从而模拟RefCell
的内部可变性功能。
关键代码示例
use std::sync::{Arc, Mutex};
fn main() {
// 创建一个Arc<Mutex<T>>,T是需要内部可变性的数据类型
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = std::thread::spawn(move || {
// 获取锁,这里会阻塞直到获得锁
let mut num = data.lock().unwrap();
*num += 1;
println!("Thread incremented value to: {}", num);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
println!("Final value: {}", *shared_data.lock().unwrap());
}
在上述代码中:
Arc<Mutex<i32>>
创建了一个可以在多个线程间共享的、具有内部可变性的i32
类型数据。data.lock().unwrap()
获取锁,从而允许对内部数据进行修改。如果锁当前被其他线程持有,lock
调用会阻塞当前线程,直到获得锁。- 多个线程通过
std::thread::spawn
创建,每个线程都会获取锁并修改内部数据,以此模拟RefCell
的内部可变性同时保证线程安全。