面试题答案
一键面试Arc(原子引用计数)工作原理
Arc 是 Atomic Reference Counting
的缩写,用于在多个线程间共享数据。它通过内部维护一个引用计数,当有新的引用指向该数据时,引用计数加一;当引用离开作用域,引用计数减一。当引用计数降为 0 时,数据被自动释放。Arc 之所以能用于多线程,是因为其引用计数的操作是原子的,避免了竞态条件。
Mutex(互斥锁)工作原理
Mutex 即 Mutual Exclusion
,是一种同步原语。它通过锁机制来保证在同一时刻只有一个线程能够访问被保护的数据。当一个线程获取到锁时,其他线程必须等待,直到该线程释放锁。这样可以防止多个线程同时修改数据,从而保证数据的一致性。
代码实现线程安全的计数器
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
// 创建一个 Arc 包裹的 Mutex,内部包含计数器
let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];
for _ in 0..10 {
// 克隆 Arc
let counter_clone = Arc::clone(&counter);
let handle = thread::spawn(move || {
// 获取 Mutex 的锁
let mut num = counter_clone.lock().unwrap();
*num += 1;
});
handles.push(handle);
}
for handle in handles {
handle.join().unwrap();
}
// 打印最终的计数值
println!("Final counter value: {}", *counter.lock().unwrap());
}
在这段代码中:
- 首先创建了一个
Arc<Mutex<i32>>
类型的counter
,Arc
用于线程间共享Mutex
,Mutex
保护内部的i32
计数器。 - 通过循环创建 10 个线程,每个线程克隆
Arc
,并获取Mutex
的锁来安全地增加计数器的值。 - 主线程等待所有子线程完成后,获取
Mutex
的锁并打印最终的计数值。