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 之后,锁的作用域和生命周期就很明显了。