From ae18f92657bbad9b6c1191b464107147b663d045 Mon Sep 17 00:00:00 2001 From: enforcer007 Date: Sun, 13 Nov 2022 16:51:59 +0530 Subject: [PATCH] threads --- exercises/threads/threads1.rs | 10 +++------- exercises/threads/threads2.rs | 13 ++++++------- exercises/threads/threads3.rs | 13 ++++++------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/exercises/threads/threads1.rs b/exercises/threads/threads1.rs index e59f4ce4..e218f704 100644 --- a/exercises/threads/threads1.rs +++ b/exercises/threads/threads1.rs @@ -2,30 +2,26 @@ // Execute `rustlings hint threads1` or use the `hint` watch subcommand for a hint. // This program should wait until all the spawned threads have finished before exiting. -// I AM NOT DONE - use std::thread; use std::time::Duration; - fn main() { - let mut handles = vec![]; for i in 0..10 { - thread::spawn(move || { + handles.push(thread::spawn(move || { thread::sleep(Duration::from_millis(250)); println!("thread {} is complete", i); - }); + })); } let mut completed_threads = 0; for handle in handles { // TODO: a struct is returned from thread::spawn, can you use it? + handle.join(); completed_threads += 1; } if completed_threads != 10 { panic!("Oh no! All the spawned threads did not finish!"); } - } diff --git a/exercises/threads/threads2.rs b/exercises/threads/threads2.rs index ada3d14a..c183634f 100644 --- a/exercises/threads/threads2.rs +++ b/exercises/threads/threads2.rs @@ -3,9 +3,7 @@ // Building on the last exercise, we want all of the threads to complete their work but this time // the spawned threads need to be in charge of updating a shared value: JobStatus.jobs_completed -// I AM NOT DONE - -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use std::thread; use std::time::Duration; @@ -14,14 +12,15 @@ struct JobStatus { } fn main() { - let status = Arc::new(JobStatus { jobs_completed: 0 }); + let status = Arc::new(Mutex::new(JobStatus { jobs_completed: 0 })); let mut handles = vec![]; for _ in 0..10 { - let status_shared = Arc::clone(&status); + let status_shared = status.clone(); let handle = thread::spawn(move || { thread::sleep(Duration::from_millis(250)); // TODO: You must take an action before you update a shared value - status_shared.jobs_completed += 1; + let mut s_shared = status_shared.lock().unwrap(); + s_shared.jobs_completed += 1; }); handles.push(handle); } @@ -29,6 +28,6 @@ fn main() { handle.join().unwrap(); // TODO: Print the value of the JobStatus.jobs_completed. Did you notice anything // interesting in the output? Do you have to 'join' on all the handles? - println!("jobs completed {}", ???); + println!("jobs completed {}", status.lock().unwrap().jobs_completed); } } diff --git a/exercises/threads/threads3.rs b/exercises/threads/threads3.rs index 9e9f285a..e8242a95 100644 --- a/exercises/threads/threads3.rs +++ b/exercises/threads/threads3.rs @@ -1,8 +1,6 @@ // threads3.rs // Execute `rustlings hint threads3` or use the `hint` watch subcommand for a hint. -// I AM NOT DONE - use std::sync::mpsc; use std::sync::Arc; use std::thread; @@ -26,13 +24,14 @@ impl Queue { fn send_tx(q: Queue, tx: mpsc::Sender) -> () { let qc = Arc::new(q); - let qc1 = Arc::clone(&qc); - let qc2 = Arc::clone(&qc); - + let qc1 = qc.clone(); + let qc2 = qc.clone(); + let trans1 = tx.clone(); + let trans2 = tx.clone(); thread::spawn(move || { for val in &qc1.first_half { println!("sending {:?}", val); - tx.send(*val).unwrap(); + trans1.clone().send(*val).unwrap(); thread::sleep(Duration::from_secs(1)); } }); @@ -40,7 +39,7 @@ fn send_tx(q: Queue, tx: mpsc::Sender) -> () { thread::spawn(move || { for val in &qc2.second_half { println!("sending {:?}", val); - tx.send(*val).unwrap(); + trans2.send(*val).unwrap(); thread::sleep(Duration::from_secs(1)); } });