面试题答案
一键面试在Rust中,我们可以使用Mutex
(互斥锁)来保护共享数据,确保同一时间只有一个线程能够访问和修改数据。以下是一个简单的示例代码:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 使用Arc(原子引用计数)来在多个线程间共享数据,因为Mutex需要`Sync`和`Send`
let data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data_clone = Arc::clone(&data);
let handle = thread::spawn(move || {
let mut num = data_clone.lock().unwrap();
*num += 1;
println!("Thread incremented data to: {}", *num);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let final_value = data.lock().unwrap();
println!("Final value of data: {}", *final_value);
}
在上述代码中:
- 我们使用
Arc<Mutex<T>>
来包装需要共享的数据。Arc
允许在多个线程间共享数据,Mutex
用于保证同一时间只有一个线程能访问数据。 - 在每个线程中,我们通过
lock()
方法获取锁,这会返回一个Result
。使用unwrap()
是为了简单起见,在实际应用中可能需要更稳健的错误处理。获取锁成功后,我们得到一个可修改的引用,从而可以安全地修改数据。 - 主线程等待所有子线程完成后,最后获取并打印数据的最终值。
这样,利用Rust的所有权系统和Mutex
,我们确保了多线程环境下数据的安全访问和修改。