Adi*_*tya 2 mutex deadlock rust
以下代码死锁,因为互斥锁在上次使用后未解锁v:
use std::sync::{Arc,Mutex};
fn main() {
let a = Arc::new(Mutex::new(3));
let mut v = a.lock().unwrap();
*v += 1;
println!("v is {v}");
// drop(v);
let b = Arc::clone(&a);
std::thread::spawn(move || {
let mut w = b.lock().unwrap();
*w += 1;
println!("w is {w}");
}).join().unwrap();
}
Run Code Online (Sandbox Code Playgroud)
修复方法是取消注释显式drop(v). v为什么编译器在最后一次使用后不会自动删除?
相比之下,Rust 编译器知道v在以下情况下尽早正确删除:
fn main() {
let mut a = 3;
let v = &mut a;
*v += 1;
println!("v is {v}");
let w = &mut a;
*w += 1;
println!("w is {w}");
}
Run Code Online (Sandbox Code Playgroud)
这种行为看起来很自然,我希望编译器也能做与上面相同的事情。
值在其范围结束时被删除,而不是在最后一次使用后。可能让您感到困惑的是,借用检查器知道引用在上次使用后是无关紧要的,因此为了执行 Rust 的引用保证,会以不同的方式考虑它们的生命周期。
从技术上讲,v在第二个示例中,直到范围结束才删除,但没有引用的删除逻辑。请参阅什么是非词汇生命周期?