Week6 done
This commit is contained in:
parent
4653d577e4
commit
d24a574405
@ -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"
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user