2017-05-19 6 views
-1

C++でそれについて学んだら、マルチスレッドのRustで遊んでいます。しかし、Rustの借用は、waitpidと同等の値を持ち、子スレッドから値を返すことを難しくしているようです。スレッディングのためにクロージャーが外に移動する

私の現在の実装では、クロスビームを使用しています。

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 

私がされていませんこの種のマルチスレッドを行う方法についての簡潔な説明を見つけることができます。私はこれを奇妙なユースケースとは考えません。

+3

あなたのエラーは、コードの行を参照する( '<左ながらleft_half.len:

あなたは、通常のスコープの終わりにリリースされる変更可能な参照、としてそれを再結合することによってそれを修正することができます( '' ')だけでなく、他の変数(' ')も提供します。 *デバッグのヘルプを求める質問(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コード**が含まれている必要があります。 [MCVE]を作成します。 – Shepmaster

答えて

1

私はあなたがベクトル上で動作しているスコープコールの後にコードを持っていると仮定します。残念ながら、スコープはベクターの所有権を取っているので、それはできません。

let mut left_half = array[0 .. half].to_vec(); 
let mut right_half = array[half .. whole].to_vec(); 
let left_half = &mut left_half; 
let right_half = &mut right_half; 
crossbeam::scope(|scope| { 
    parts.push(scope.spawn(move || i32_merge_sort(left_half))); 
    parts.push(scope.spawn(move || i32_merge_sort(right_half))); 
}); 
関連する問題