在使用互斥锁的时候,我发现
let x = *l2.lock().unwrap();
这一行会同时释放锁,所以try_lock
可以正常获取到
fn main() {
let l1 = Arc::new(Mutex::new(21));
let l2 = Arc::clone(&l1);
let t1 = thread::spawn(move ||{
let x = *l2.lock().unwrap();
thread::sleep(Duration::from_secs(10));
});
thread::sleep(Duration::from_secs(2));
let _ = l1.try_lock().expect("get lock error");
}
而下面这段锁的作用域会持续到子线程结束,导致主线程的try_lock()
获取失败
fn main() {
let l1 = Arc::new(Mutex::new(21));
let l2 = Arc::clone(&l1);
let t1 = thread::spawn(move ||{
let x = l2.lock().unwrap();
let num = *x;
println!("{}", num);
thread::sleep(Duration::from_secs(10));
});
thread::sleep(Duration::from_secs(2));
let _ = l1.try_lock().expect("get lock error");
}
我想知道*
解引用时发生了什么?
1
共 3 条评论, 1 页
评论区
写评论谢谢
--
👇
linqingyao: 在
let x = *l2.lock().unwrap();
中l2.lock().unwrap()
是一个临时变量,一旦完成这条语句被执行完就会被Drop
,你可以通过 MIR 查看。在 Rust Reference 中也有说到 https://doc.rust-lang.org/reference/destructors.html#temporary-scopes在
let x = *l2.lock().unwrap();
中l2.lock().unwrap()
是一个临时变量,一旦完成这条语句被执行完就会被Drop
,你可以通过 MIR 查看。在 Rust Reference 中也有说到 https://doc.rust-lang.org/reference/destructors.html#temporary-scopes与 drop 作用域 有关。
与
*
无关。像锁这种依赖于 Drop 来释放锁的类型,首先学习 Drop。