面试题答案
一键面试-
使用
Arc
和Mutex
在多线程中安全使用引用:Arc
(原子引用计数)用于在多个线程间共享数据。它允许数据在多个线程间克隆,而其内部的引用计数机制保证当所有对数据的引用都消失时,数据会被正确释放。Mutex
(互斥锁)用于保护共享数据,确保在任何时刻只有一个线程可以访问被保护的数据。线程在访问数据前需要获取锁,访问完成后释放锁。这样就避免了多个线程同时修改数据导致的数据竞争问题。
-
示例代码:
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();
}
// 主线程获取锁并打印最终结果
let final_result = shared_data.lock().unwrap();
println!("Final result: {}", *final_result);
}
在上述代码中:
- 首先创建了一个
Arc<Mutex<i32>>
类型的shared_data
,初始值为0。 - 然后通过
for
循环创建10个线程,每个线程克隆一份Arc
并尝试获取Mutex
的锁,获取成功后对内部的整数加1。 - 主线程等待所有线程完成后,获取锁并打印最终的结果。这样通过
Arc
和Mutex
确保了在多线程环境下对共享数据的安全访问和修改。