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
|
||||
|
||||
[dependencies]
|
||||
crossbeam-channel = "0.4.2"
|
||||
crossbeam-channel = "0.5.7"
|
||||
@ -8,16 +8,54 @@ where
|
||||
U: Send + 'static + Default,
|
||||
{
|
||||
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!
|
||||
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
|
||||
}
|
||||
|
||||
fn main() {
|
||||
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| {
|
||||
println!("{} squared is {}", num, num * num);
|
||||
thread::sleep(time::Duration::from_millis(500));
|
||||
num * num
|
||||
});
|
||||
assert_eq!(squares_std, squares);
|
||||
println!("squares: {:?}", squares);
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user