在使用互斥锁的时候,我发现
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。