面试题答案
一键面试Mutex的作用
Mutex(互斥锁)在Rust中用于保护共享数据,确保同一时间只有一个线程可以访问该数据。它通过提供一种机制,让线程在访问数据前获取锁,访问结束后释放锁。这样可以避免多个线程同时修改数据导致的数据竞争问题。
Arc的作用
Arc(原子引用计数)用于在多个线程间共享数据。它是引用计数智能指针,能够跟踪有多少个指针指向同一数据。Arc允许数据在多个线程间安全地共享,因为它的引用计数操作是原子的,这保证了在多线程环境下引用计数的修改不会出现数据竞争。
二者配合确保线程安全
Mutex通常与Arc一起使用,当需要在多个线程间共享可变数据时,Arc用于在多个线程间传递数据的所有权,Mutex用于保护数据不被同时访问。
以下是一个简单代码示例:
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let shared_data = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
let data = Arc::clone(&shared_data);
let handle = thread::spawn(move || {
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
在多个线程间共享。每个线程通过 Arc::clone
获取数据的共享引用,然后使用 lock
方法获取 Mutex
的锁来修改数据。由于 Mutex
的存在,同一时间只有一个线程能修改 i32
数据,从而确保了线程安全。