Week6 done

This commit is contained in:
ridethepig 2023-03-08 11:27:13 +08:00
parent 4653d577e4
commit d24a574405
2 changed files with 39 additions and 1 deletions

View File

@ -7,4 +7,4 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
crossbeam-channel = "0.4.2" crossbeam-channel = "0.5.7"

View File

@ -8,16 +8,54 @@ where
U: Send + 'static + Default, U: Send + 'static + Default,
{ {
let mut output_vec: Vec<U> = Vec::with_capacity(input_vec.len()); let mut output_vec: Vec<U> = Vec::with_capacity(input_vec.len());
for _ in 0..input_vec.len() {
output_vec.push(U::default());
}
// TODO: implement parallel map! // TODO: implement parallel map!
let (distri_s, distri_r) = crossbeam_channel::unbounded();
let (collect_s , collect_r) = crossbeam_channel::unbounded();
let mut thread_handlers = Vec::new();
for _ in 0..num_threads {
let distri_r = distri_r.clone();
let collect_s = collect_s.clone();
let handler = thread::spawn(move || {
while let Ok((val, idx)) = distri_r.recv() {
let val = f(val);
collect_s.send((val, idx)).unwrap();
}
});
thread_handlers.push(handler);
}
drop(collect_s);
println!("spawned {} threads", num_threads);
let mut distri_counter = input_vec.len();
while let Some(val) = input_vec.pop() {
distri_counter -= 1;
distri_s.send((val, distri_counter)).unwrap();
}
drop(distri_s);
while let Ok((val, idx)) = collect_r.recv() {
output_vec[idx] = val;
}
println!("collected {} values", output_vec.len());
for handler in thread_handlers {
let _ = handler.join();
}
output_vec output_vec
} }
fn main() { fn main() {
let v = vec![6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 12, 18, 11, 5, 20]; let v = vec![6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 12, 18, 11, 5, 20];
let mut squares_std = Vec::new();
for val in &v {
squares_std.push(val * val);
}
let squares = parallel_map(v, 10, |num| { let squares = parallel_map(v, 10, |num| {
println!("{} squared is {}", num, num * num); println!("{} squared is {}", num, num * num);
thread::sleep(time::Duration::from_millis(500)); thread::sleep(time::Duration::from_millis(500));
num * num num * num
}); });
assert_eq!(squares_std, squares);
println!("squares: {:?}", squares); println!("squares: {:?}", squares);
} }