summaryrefslogtreecommitdiff
path: root/exercises/19_smart_pointers/arc1.rs
diff options
context:
space:
mode:
authorAdam Brewer <adamhb321@gmail.com>2023-10-16 07:37:12 -0400
committerAdam Brewer <adamhb321@gmail.com>2023-10-16 07:37:12 -0400
commit64d95837e9813541cf5b357de13865ce687ae98d (patch)
treef022c5d5ba01128811c0b77618a7adb843ee876b /exercises/19_smart_pointers/arc1.rs
parentc3941323e2c0b9ee286494327de92e00f23b9e3a (diff)
Update Exercises Directory Names to Reflect Order
Diffstat (limited to 'exercises/19_smart_pointers/arc1.rs')
-rw-r--r--exercises/19_smart_pointers/arc1.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/exercises/19_smart_pointers/arc1.rs b/exercises/19_smart_pointers/arc1.rs
new file mode 100644
index 0000000..3526ddc
--- /dev/null
+++ b/exercises/19_smart_pointers/arc1.rs
@@ -0,0 +1,45 @@
+// arc1.rs
+//
+// In this exercise, we are given a Vec of u32 called "numbers" with values
+// ranging from 0 to 99 -- [ 0, 1, 2, ..., 98, 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. We need to make a change in each of the two TODOs.
+//
+// Make this code compile by filling in a value for `shared_numbers` where the
+// first TODO comment is, and create an initial binding for `child_numbers`
+// where the second TODO comment is. Try not to create any copies of the
+// `numbers` Vec!
+//
+// Execute `rustlings hint arc1` or use the `hint` watch subcommand for a hint.
+
+// I AM NOT DONE
+
+#![forbid(unused_imports)] // Do not change this, (or the next) line.
+use std::sync::Arc;
+use std::thread;
+
+fn main() {
+ let numbers: Vec<_> = (0..100u32).collect();
+ let shared_numbers = // TODO
+ let mut joinhandles = Vec::new();
+
+ for offset in 0..8 {
+ let child_numbers = // TODO
+ joinhandles.push(thread::spawn(move || {
+ let sum: u32 = child_numbers.iter().filter(|&&n| n % 8 == offset).sum();
+ println!("Sum of offset {} is {}", offset, sum);
+ }));
+ }
+ for handle in joinhandles.into_iter() {
+ handle.join().unwrap();
+ }
+}