如何解决使用互斥锁的while循环参数的生存期是多少?
我正在研究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循环立即释放了锁?
解决方法
是因为Jobs_completed是一个固定大小的变量,并且当我们借入该值并立即释放锁时将其复制到堆栈上吗?
锁被释放,因为锁保护仅用于访问jobs_completed
的时间,因此,锁仅在while
的条件的跨度内保持。
如果用“固定大小的变量”来表示Sized
,则……不。 jobs_completed
是Copy
使事情变得更简单,但是即使不是锁,对于循环条件的跨度,仍然仅需要 来保持,因此无需保持它显然,它仍然不会在整个循环中保留。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。