面试题答案
一键面试- 基本步骤:
- 引入必要的库:在Rust中,
Mutex
和Arc
都来自标准库,因此只需在文件开头引入它们,通常使用use std::sync::{Mutex, Arc};
。 - 创建共享数据:用
Mutex
包裹需要共享的数据,因为Mutex
提供了互斥访问的机制。然后将这个Mutex
实例用Arc
进行包裹,Arc
是原子引用计数指针,用于在多个线程间安全地共享数据。 - 在不同线程中操作数据:在每个线程中,通过
Arc
获取Mutex
的引用,然后使用lock
方法获取锁。一旦获取到锁,就可以安全地访问和修改Mutex
包裹的数据。操作完成后,锁会自动释放(通过MutexGuard
的析构函数)。
- 引入必要的库:在Rust中,
- 示例代码:
use std::sync::{Mutex, Arc};
use std::thread;
fn main() {
// 创建一个用Mutex包裹的共享数据,并使用Arc来共享
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;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
let final_result = data.lock().unwrap();
println!("Final result: {}", *final_result);
}
在这个示例中,我们创建了一个共享的Mutex<i32>
,初始值为0。然后我们启动10个线程,每个线程获取锁,将数据加1。最后,主线程等待所有线程完成,并打印最终的结果。