由于线程而将值移出闭包

时间:2017-05-19 18:47:26

标签: multithreading rust

在使用C ++学习它之后,我正在玩多线程Rust。然而,Rust的借用似乎很难使等效于waitpid并从子线程中返回值。

我目前的实施使用crossbeam:

let half = array.len() / 2;
let whole = array.len();
let mut left_half = array[0 .. half].to_vec();
let mut right_half = array[half .. whole].to_vec();
crossbeam::scope(|scope| {
    parts.push(scope.spawn(move || i32_merge_sort(&mut left_half)));
    parts.push(scope.spawn(move || i32_merge_sort(&mut right_half)));
});

由于关闭而产生了以下错误,并且生成的线程中的值没有被正确等待:

error[E0382]: use of moved value: `left_half`
  --> src\main.rs:39:22
   |
29 |         crossbeam::scope(|scope| {
   |                          ------- value moved (into closure) here
...
39 |         while left < left_half.len() && right < right_half.len() {
   |                      ^^^^^^^^^ value used here after move
   |
   = note: move occurs because `left_half` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait

我无法找到关于如何进行这种多线程的简明解释,我不认为这是一个奇怪的用例。

1 个答案:

答案 0 :(得分:1)

我假设你在范围调用之后有代码,它在向量上运行。不幸的是,范围取决于向量的所有权,所以它不能。

您可以通过将其重新绑定为可变引用来修复它,该引用通常会在范围的末尾发布:

export const uploadProductEpic = action$ =>
  action$.ofType(UPLOAD_PRODUCT)
    .mergeMap(action => { // <--------------------------- whoops!
      ajax.post(
        'http://192.168.20.3:4000/products', 
        action.payload,
        { 'Content-Type': 'application/json' })
    })