From 791120c0c1ac66186a5a1b05cc525d94d19ea5f3 Mon Sep 17 00:00:00 2001 From: Donald Guy Date: Tue, 4 May 2021 18:49:13 -0400 Subject: [PATCH] threads1: use more threads, model more reference counting - Switch from a single additional thread (receiving/holding a single `Arc::clone` reference) running a loop modeling 10 sequential jobs, to a loop generating 10 threads each modeling 1 job (each getting their own `Arc::clone` reference) - use the previously ignored `for` loop var to keep the execution timing approx the same - Print a more descriptive waiting message (taking an opportunity to use comment to disambiguate the count) --- exercises/threads/threads1.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index f31b317e..4bf6aa34 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -1,10 +1,7 @@ // threads1.rs // Make this compile! Execute `rustlings hint threads1` for hints :) -// The idea is the thread spawned on line 22 is completing jobs while the main thread is -// monitoring progress until 10 jobs are completed. Because of the difference between the -// spawned threads' sleep time, and the waiting threads sleep time, when you see 6 lines -// of "waiting..." and the program ends without timing out when running, -// you've got it :) +// The idea is the threads spawned on line 22 are completing jobs while the main thread is +// monitoring progress until 10 jobs are completed. // I AM NOT DONE @@ -18,15 +15,18 @@ struct JobStatus { fn main() { let status = Arc::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.jobs_completed += 1; - } - }); + for i in 0..10 { + let status_ref = Arc::clone(&status); + thread::spawn(move || { + thread::sleep(Duration::from_millis(250 * i)); + status_ref.jobs_completed += 1; + }); + } while status.jobs_completed < 10 { - println!("waiting... "); + println!("waiting for {} jobs ({} jobs running)... ", + (10 - status.jobs_completed), + (Arc::strong_count(&status) - 1) // subtract one for refrence in _this_ thread + ); thread::sleep(Duration::from_millis(500)); } }