< 返回版块

Ryu2u 发表于 2023-01-09 15:06

Tags:rust

在使用互斥锁的时候,我发现

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");
}

我想知道*解引用时发生了什么?

评论区

写评论
作者 Ryu2u 2023-01-12 14:12

谢谢

--
👇
linqingyao: 在 let x = *l2.lock().unwrap();l2.lock().unwrap() 是一个临时变量,一旦完成这条语句被执行完就会被 Drop,你可以通过 MIR 查看。在 Rust Reference 中也有说到 https://doc.rust-lang.org/reference/destructors.html#temporary-scopes

linqingyao 2023-01-10 18:06

let x = *l2.lock().unwrap();l2.lock().unwrap() 是一个临时变量,一旦完成这条语句被执行完就会被 Drop,你可以通过 MIR 查看。在 Rust Reference 中也有说到 https://doc.rust-lang.org/reference/destructors.html#temporary-scopes

苦瓜小仔 2023-01-09 15:33

drop 作用域 有关。

* 无关。

像锁这种依赖于 Drop 来释放锁的类型,首先学习 Drop。

1 共 3 条评论, 1 页