以下代码死锁,因为互斥锁在上次使用后未解锁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 += …Run Code Online (Sandbox Code Playgroud)