面试题答案
一键面试代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个Arc<Mutex<Vec<i32>>>
let shared_vec = Arc::new(Mutex::new(vec![1, 2, 3]));
let mut handles = vec![];
for _ in 0..3 {
let cloned_vec = Arc::clone(&shared_vec);
let handle = thread::spawn(move || {
let mut vec = cloned_vec.lock().unwrap();
vec.push(4);
println!("{:?}", vec);
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
}
Arc
和Mutex
的作用
Arc
(原子引用计数指针):Arc
用于在多个线程间共享数据。它通过引用计数来跟踪有多少个变量持有对数据的引用。当引用计数降为0时,数据会被自动释放。在多线程环境下,Arc
使用原子操作来保证引用计数的线程安全性,这样多个线程可以安全地共享同一个数据结构的所有权。
Mutex
(互斥锁):Mutex
用于保护共享数据,确保同一时间只有一个线程可以访问和修改数据。当一个线程调用lock
方法时,如果互斥锁没有被其他线程锁住,那么这个线程就会获得锁并可以访问被保护的数据。如果互斥锁已经被锁住,那么调用lock
的线程会被阻塞,直到锁被释放。Mutex
内部使用操作系统提供的同步原语来实现线程安全。
在上述代码中,Arc
用于在多个线程间共享Mutex<Vec<i32>>
,而Mutex
则用于保护Vec<i32>
,确保在任何时刻只有一个线程能够修改Vec
。