小编Adi*_*tya的帖子

为什么上次使用后这个值没有被删除?

以下代码死锁,因为互斥锁在上次使用后未解锁v

use std::sync::{Arc,Mutex};

fn main() {
    let a = Arc::new(Mutex::new(3));
    let mut v = a.lock().unwrap();
    *v += 1;
    println!("v is {v}");
    // drop(v);
    let b = Arc::clone(&a);
    std::thread::spawn(move || {
        let mut w = b.lock().unwrap();
        *w += 1;
        println!("w is {w}");
    }).join().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

修复方法是取消注释显式drop(v). v为什么编译器在最后一次使用后不会自动删除?

相比之下,Rust 编译器知道v在以下情况下尽早正确删除:

fn main() {
    let mut a = 3;
    let v = &mut a;
    *v += 1;
    println!("v is {v}");
    let w = &mut a;
    *w += …
Run Code Online (Sandbox Code Playgroud)

mutex deadlock rust

2
推荐指数
1
解决办法
129
查看次数

标签 统计

deadlock ×1

mutex ×1

rust ×1