面试题答案
一键面试Arc
的作用
Arc
即原子引用计数(Atomic Reference Counting)指针。它允许在多个线程间共享数据。Arc
通过引用计数的方式,记录有多少个Arc
实例指向同一个数据。当最后一个Arc
实例被销毁时,其所指向的数据也会被释放。由于引用计数的操作需要原子操作以确保在多线程环境下的正确性,所以Arc
适用于多线程场景。
Mutex
的作用
Mutex
即互斥锁(Mutual Exclusion)。它用于保护共享数据,确保在同一时刻只有一个线程能够访问该数据。当一个线程获取了Mutex
的锁,其他线程必须等待锁被释放后才能获取锁并访问数据,以此保证数据的一致性和线程安全。
组合使用的原因
Arc
使得数据可以在多个线程间共享,但它本身并不提供同步机制,多个线程同时访问和修改共享数据会导致数据竞争。而Mutex
提供了同步机制,保证同一时刻只有一个线程能访问数据。所以将Arc
和Mutex
组合使用,Arc
负责在多线程间共享数据,Mutex
负责保护共享数据,确保线程安全。
代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let shared_vec = Arc::new(Mutex::new(vec![1, 2, 3]));
let mut handles = vec![];
for _ in 0..3 {
let clone = Arc::clone(&shared_vec);
let handle = thread::spawn(move || {
let mut vec = clone.lock().unwrap();
vec.push(4);
println!("{:?}", vec);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
在上述代码中,首先创建了一个Arc<Mutex<Vec<i32>>>
类型的shared_vec
。然后通过Arc::clone
在每个线程中创建Arc
的克隆,每个线程获取Mutex
的锁,修改Vec<i32>
,最后打印修改后的结果。join
方法等待所有线程执行完毕。