Rust Mutex陷阱

Rust Mutex陷阱

持续更新

1.if let .. else 导致的死锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use std::sync::Mutex;
use std::collections::HashMap;

fn main() {
let map = Mutex::new(HashMap::<String, Vec<String>>::new());

if let Some(m) = map.lock().unwrap().get(&"1".to_string()) {
println!("11111");
println!("{:?}", m);
} else {
map.lock().unwrap().get(&"2".to_string());
println!("22222");
};
}

发生该场景的代码如上所示,一开始以为 if let 分支走完就会 drop 掉 m,进而释放锁,然后 else 分支中会再度持有锁。但现实却是 if let 分支会一直持有锁,经过翻找资料之后^1,将上面的代码转换成如下形式即可理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use std::sync::Mutex;
use std::collections::HashMap;

fn main() {
let map = Mutex::new(HashMap::<String, Vec<String>>::new());

match map.lock().unwrap().get(&"1".to_string()) {
Some(m) => {
println!("11111");
println!("{:?}", m);
}
_ => {
map.lock().unwrap().get(&"2".to_string());
println!("22222");
}
};
}

这样等价转换为 match 之后,锁的作用域和生命周期就很明显了。