diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index f31b317..1adef48 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -4,7 +4,13 @@ // 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 :) +// you've got it :) +// Why 6 lines, you ask? because the program will spawn one new thread that will increment +// the Jobstatus on 250ms intervals. At the same time, our original thread will check +// the Jobstatus at 500ms intervals. So, this count should be ~0 on the first iteration of +// the `while` loop; ~2 on the second iteration; ~4 on the third iteration; finally, +// ~10 on the sixth. Why? Because by the time our main thread peeks at the JobStatus counter, +// our second spawned thread will have already run two incremental operations on it. // I AM NOT DONE @@ -17,14 +23,19 @@ struct JobStatus { } fn main() { + // TODO: Change the line below let status = Arc::new(JobStatus { jobs_completed: 0 }); let status_shared = status.clone(); + // The code below spawns a single new thread that will run a for-loop code block 10 times. thread::spawn(move || { for _ in 0..10 { thread::sleep(Duration::from_millis(250)); + // TODO: change the line below status_shared.jobs_completed += 1; } }); + // The code below will check the count on JobStatus on 500ms intervals. + // TODO: Change the line below while status.jobs_completed < 10 { println!("waiting... "); thread::sleep(Duration::from_millis(500));