gpt4 book ai didi

multithreading - 由于线程化,将值移出闭包

转载 作者:行者123 更新时间:2023-11-29 08:35:25 27 4
gpt4 key购买 nike

在了解了 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

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

最佳答案

我假设您在作用域调用之后有代码,该代码对向量进行操作。不幸的是,作用域正在取得向量的所有权,所以它不能。

您可以通过将其重新绑定(bind)为可变引用来修复它,它通常会在作用域结束时释放:

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)));
});

关于multithreading - 由于线程化,将值移出闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44077046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com