在使用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
我无法找到关于如何进行这种多线程的简明解释,我不认为这是一个奇怪的用例。
答案 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' })
})