Concurrency 使用互斥锁的while循环参数的生命周期是多少?
我正在进行Rust的生锈练习,并提出了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 _
螺纹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
使事情变得更简单,但即使不是这样,锁仍然只需要在循环条件的范围内保持,因此如果不显式地保持它,它也不会在整个循环中保持