面试题答案
一键面试Arc(原子引用计数)工作原理
Arc 是 Rust 标准库提供的原子引用计数智能指针。它通过内部维护一个引用计数,当引用该指针的地方增多或减少时,引用计数相应地增加或减少。当引用计数降为 0 时,Arc 指向的资源会被自动释放。Arc 能够在多线程环境下安全地共享数据,因为其引用计数的操作是原子的,避免了数据竞争。
Mutex(互斥锁)工作原理
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();
}
// 打印最终结果
println!("Final value: {}", *shared_data.lock().unwrap());
}
在上述代码中:
- 首先创建了一个
Arc<Mutex<i32>>
类型的shared_data
,这使得数据可以在多线程间安全共享,并且通过Mutex
来控制对内部i32
数据的访问。 - 然后通过循环创建 10 个线程,每个线程克隆
Arc
并尝试获取Mutex
的锁,对内部数据进行加 1 操作。 - 主线程等待所有子线程执行完毕后,获取锁并打印最终的数据值。