Rust: Executing dereferenced closure inside a task -


i have code takes vector of functions , iterates on them , executes each 1 @ each step. trying incorporate tasks loop these function calls can executed asynchronously instead of having first 1 block second 1 , on...

let mut arr: vec<|i32| -> i32> = vec::new(); arr.push(function1); arr.push(function2);  let ref num_in = os::args()[1]; let num_str = num_in.to_string();  let num = match from_str::<i32>(num_str.as_slice()) {     some(x) => x,     none => panic!("not number"), };  f in arr.iter_mut() {     spawn(proc(){         println!("{}", (*f)(num.clone()));     }); }; 

without task, , doing println! inside loop code runs fine, in blocking way trying avoid using tasks. task these errors , notes...

error: trait 'core::kinds::send' not implemented type '&mut |i32| -> i32'

note: closure captures 'f' requires captured variables implement trait 'core::kinds::send'

there couple of issues in code:

f is, compiler telling you, &mut |i32|->i32. it's borrowed reference 1 of vector elements. such borrowed reference cannot sent across task boundary. easy rule prevent dangling pointers , memory safety errors because scope-based lifetime guarantees don't work if multiple threads involved.

but of type |i32|->i32 borrowed reference (generally) because borrows environment. if don't capture variables (“empty environment”), use fn(i32) -> i32 instead sendable. can think of simple function pointer.

letting other tasks execute carries own environment (as in “not borrowed”) done proc. that's purpose. you're using procs reason. compiler copies f proc makes whole proc non-sendable because borrowed reference non-sendable.

in near future, we'll “unboxed closures” make procs superfluous. then, should able use vec<box<fnonce(i32)->i32 + send>> or vec<box<fn(i32)->i32 + send>> replacement vec<proc(i32)->i32>. , creating these kinds of boxes involve box , move keyword cast trait object.


Comments

Popular posts from this blog

python - mat is not a numerical tuple : openCV error -

c# - MSAA finds controls UI Automation doesn't -

wordpress - .htaccess: RewriteRule: bad flag delimiters -