summaryrefslogtreecommitdiff
path: root/solutions/19_smart_pointers/arc1.rs
diff options
context:
space:
mode:
Diffstat (limited to 'solutions/19_smart_pointers/arc1.rs')
-rw-r--r--solutions/19_smart_pointers/arc1.rs43
1 files changed, 42 insertions, 1 deletions
diff --git a/solutions/19_smart_pointers/arc1.rs b/solutions/19_smart_pointers/arc1.rs
index 4e18198..a520dfe 100644
--- a/solutions/19_smart_pointers/arc1.rs
+++ b/solutions/19_smart_pointers/arc1.rs
@@ -1 +1,42 @@
-// Solutions will be available before the stable release. Thank you for testing the beta version 🥰
+// In this exercise, we are given a `Vec` of u32 called `numbers` with values
+// ranging from 0 to 99. We would like to use this set of numbers within 8
+// different threads simultaneously. Each thread is going to get the sum of
+// every eighth value with an offset.
+//
+// The first thread (offset 0), will sum 0, 8, 16, …
+// The second thread (offset 1), will sum 1, 9, 17, …
+// The third thread (offset 2), will sum 2, 10, 18, …
+// …
+// The eighth thread (offset 7), will sum 7, 15, 23, …
+//
+// Because we are using threads, our values need to be thread-safe. Therefore,
+// we are using `Arc`.
+
+// Don't change the lines below.
+#![forbid(unused_imports)]
+use std::{sync::Arc, thread};
+
+fn main() {
+ let numbers: Vec<_> = (0..100u32).collect();
+
+ let shared_numbers = Arc::new(numbers);
+ // ^^^^^^^^^^^^^^^^^
+
+ let mut join_handles = Vec::new();
+
+ for offset in 0..8 {
+ let child_numbers = Arc::clone(&shared_numbers);
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ let handle = thread::spawn(move || {
+ let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum();
+ println!("Sum of offset {offset} is {sum}");
+ });
+
+ join_handles.push(handle);
+ }
+
+ for handle in join_handles.into_iter() {
+ handle.join().unwrap();
+ }
+}