Concurrency 使用互斥锁的while循环参数的生命周期是多少?

Concurrency 使用互斥锁的while循环参数的生命周期是多少?,concurrency,rust,mutex,Concurrency,Rust,Mutex,我正在进行Rust的生锈练习,并提出了螺纹1.rs的解决方案,如下所示: struct JobStatus { jobs_completed: u32, } fn main() { let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 })); let status_shared = status.clone(); thread::spawn(move || { for _

我正在进行Rust的生锈练习,并提出了
螺纹1.rs
的解决方案,如下所示:

struct JobStatus {
    jobs_completed: u32,
}

fn main() {
    let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 }));
    let status_shared = status.clone();
    thread::spawn(move || {
        for _ in 0..10 {
            thread::sleep(Duration::from_millis(250));
            status_shared.lock().unwrap().jobs_completed += 1;
        }
    });

    // WHILE LOOP IN QUESTION //
    while status.lock().unwrap().jobs_completed < 10 {
        println!("waiting... ");
        thread::sleep(Duration::from_millis(500));
    }
}
struct作业状态{
完成的工作:u32,
}
fn main(){
让status=Arc::new(Mutex::new(JobStatus{jobs_completed:0}));
让status_shared=status.clone();
线程::生成(移动| |{
对于0..10中的uu{
线程::睡眠(持续时间::从_毫秒(250));
状态_shared.lock().unwrap().jobs_completed+=1;
}
});
//有问题的WHILE循环//
当status.lock().unwrap()作业完成时<10{
println!(“等待…”);
线程::睡眠(持续时间::从_毫秒(500));
}
}
上面的解决方案可以完美地工作,并提供所需的结果(即,主线程只需等待6次,生成的线程就可以完成10次迭代)

然而,根据Rust的文档,只有当特定锁超出范围时,才会释放互斥锁。但是我不明白为什么在while循环中创建的锁在整个迭代过程中没有保持,从而使主线程等待了10多次。这是因为
jobs\u completed
是一个固定大小的变量,当我们借用该值时会复制到堆栈中,从而立即释放锁吗?或者while循环立即释放锁还有其他原因吗

这是因为jobs_completed是一个固定大小的变量,当我们借用该值并因此立即释放锁时,它会复制到堆栈上吗

锁正在释放,因为锁防护装置仅在访问已完成的
作业时使用,因此锁仅在
处于
状态时保持

如果“固定大小变量”的意思是
大小
那么。。。不。完成的
jobs\u
Copy
使事情变得更简单,但即使不是这样,锁仍然只需要在循环条件的范围内保持,因此如果不显式地保持它,它也不会在整个循环中保持