我正在研究Rust的 rustlings 练习,并提出了针对‘ or 1='1_AjaWar_Prav_2_FT_20200701.pdf
的解决方案,如下所示:
threads1.rs
上面的解决方案可以完美地工作并给出期望的结果(即主线程只需要等待6次,生成的线程就可以完成10次迭代)。
但是,根据Rust的文档,仅当特定锁超出范围时才释放Mutex的锁。但是我不明白为什么在整个循环中都没有保留在while循环中创建的锁,从而使主线程等待10次以上。是因为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));
}
}
是一个固定大小的变量,并且当我们借入该值并立即释放锁时将其复制到堆栈中吗?还是有其他原因使得while循环立即释放了锁?