面试题答案
一键面试锁排序死锁预防策略
死锁发生的一个常见原因是多个线程以不同顺序获取锁。锁排序策略要求所有线程以相同顺序获取锁。这样,不会出现循环依赖,从而避免死锁。
Rust代码示例
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let mutex1 = Arc::new(Mutex::new(0));
let mutex2 = Arc::new(Mutex::new(1));
let mutex1_clone = mutex1.clone();
let mutex2_clone = mutex2.clone();
let handle1 = thread::spawn(move || {
let _lock1 = mutex1_clone.lock().unwrap();
let _lock2 = mutex2_clone.lock().unwrap();
println!("Thread 1 acquired both locks");
});
let handle2 = thread::spawn(move || {
let _lock1 = mutex1.lock().unwrap();
let _lock2 = mutex2.lock().unwrap();
println!("Thread 2 acquired both locks");
});
handle1.join().unwrap();
handle2.join().unwrap();
}
在上述代码中,两个线程都先获取 mutex1
再获取 mutex2
,通过这种一致的锁获取顺序避免了死锁。如果线程2尝试先获取 mutex2
,就可能导致死锁,因为 mutex2
可能已经被线程1获取,而线程1在等待 mutex2
释放之前不会释放 mutex1
。按照锁排序策略,所有线程以相同顺序获取锁,死锁风险就消除了。