使用互斥锁的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循环立即释放了锁?

iCMS 回答:使用互斥锁的while循环参数的生存期是多少?

是因为Jobs_completed是一个固定大小的变量,并且当我们借入该值并立即释放锁时将其复制到堆栈上吗?

锁被释放,因为锁保护仅用于访问jobs_completed的时间,因此,锁仅在while条件的跨度内保持

如果用“固定大小的变量”来表示Sized,则……不。 jobs_completedCopy使事情变得更简单,但是即使不是锁,对于循环条件的跨度,仍然仅需要 来保持,因此无需保持它显然,它仍然不会在整个循环中保留。

本文链接:https://www.f2er.com/1769077.html

大家都在问