Rust代码示例展示死锁场景
use std::sync::{Arc, Mutex};
use std::thread;
fn main() {
let lock1 = Arc::new(Mutex::new(0));
let lock2 = Arc::new(Mutex::new(0));
let lock1_clone = lock1.clone();
let lock2_clone = lock2.clone();
let thread_a = thread::spawn(move || {
let _guard1 = lock1_clone.lock().unwrap();
println!("Thread A acquired lock1");
let _guard2 = lock2_clone.lock().unwrap();
println!("Thread A acquired lock2");
});
let thread_b = thread::spawn(move || {
let _guard2 = lock2.lock().unwrap();
println!("Thread B acquired lock2");
let _guard1 = lock1.lock().unwrap();
println!("Thread B acquired lock1");
});
thread_a.join().unwrap();
thread_b.join().unwrap();
}
死锁发生的原因
- 资源竞争:线程A和线程B都需要获取
lock1
和lock2
这两个资源(锁)。
- 持有并等待:线程A已经获取了
lock1
,然后试图获取lock2
,而此时线程B已经获取了lock2
并试图获取lock1
。
- 不可剥夺:一旦一个线程获取了锁,其他线程不能强行剥夺该锁。
- 循环等待:线程A等待线程B释放
lock2
,而线程B等待线程A释放lock1
,形成了一个循环等待的关系,从而导致死锁。