summaryrefslogtreecommitdiff
path: root/solutions/19_smart_pointers/arc1.rs
diff options
context:
space:
mode:
authormo8it <mo8it@proton.me>2024-07-05 13:39:50 +0200
committermo8it <mo8it@proton.me>2024-07-05 13:39:50 +0200
commit7123c7ae3a9605fbe962e4ef0a0f1424cd16fef8 (patch)
treec67f7e62bb9a179ae4fdbab492501cb6847e64c7 /solutions/19_smart_pointers/arc1.rs
parent77b687d501771c24bd83294d97b8e6f9ffa92d6b (diff)
parent4d9c346a173bb722b929f3ea3c00f84954483e24 (diff)
Merge remote-tracking branch 'upstream/main' into fix-enum-variant-inconsistency
Diffstat (limited to 'solutions/19_smart_pointers/arc1.rs')
-rw-r--r--solutions/19_smart_pointers/arc1.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/solutions/19_smart_pointers/arc1.rs b/solutions/19_smart_pointers/arc1.rs
new file mode 100644
index 0000000..bd76189
--- /dev/null
+++ b/solutions/19_smart_pointers/arc1.rs
@@ -0,0 +1,45 @@
+// 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, …
+//
+// Each thread should own a reference-counting pointer to the vector of
+// numbers. But `Rc` isn't thread-safe. Therefore, we need to use `Arc`.
+//
+// Don't get distracted by how threads are spawned and joined. We will practice
+// that later in the exercises about threads.
+
+// 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();
+ }
+}