Rust多线程密集型方法需要访问与Rayon相同的数据集

des4xlb0  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(122)

我使用Rayons par_iter()来迭代我需要运行的昂贵方法的不同变体。这些运行需要访问相同的已检查大小集,因为它们都需要不时地添加和检查它。我还需要在第一个线程完成时关闭它们,这就是为什么我有一个kill_switch,当它设置为true时,它将强制迭代退出。

let mut checked: HashSet<usize> = HashSet::new();
let mut kill_switch: bool = false;

permutations.par_iter().for_each(|order| {
    let board = Board::new(board_map.clone(), order.clone());
    let mut bubbles: Vec<(i8, i8)> = Vec::new();
    if let Some(bubbles) = board.solve(&mut bubbles, &mut checked, &kill_switch) {
        kill_switch = true;
        bubbles.into_iter().for_each(|bubble| {
            dbg!(bubble);
        });
    }
})

这是我目前的代码,但是我在使用checked和kill_switch时出现错误。我该如何处理这些错误?
错误:

  • 无法借用checked作为可变变量,因为它是Fn闭包中捕获的变量无法借用为可变变量[E0596]
  • 无法分配给kill_switch,因为它是Fn闭包中捕获的变量,无法分配[E0594]
6pp0gazn

6pp0gazn1#

要修复这些错误,需要使用RefCells Package checked和kill_switch变量,并使用borrow_mut方法在闭包中获取对它们的可变引用。
下面是如何修改代码的示例:

use std::cell::RefCell;
use std::collections::HashSet;

let checked: RefCell<HashSet<usize>> = RefCell::new(HashSet::new());
let kill_switch: RefCell<bool> = RefCell::new(false);

permutations.par_iter().for_each(|order| {
    let board = Board::new(board_map.clone(), order.clone());
    let mut bubbles: Vec<(i8, i8)> = Vec::new();
    if let Some(bubbles) = board.solve(&mut bubbles, &mut checked.borrow_mut(), &mut kill_switch.borrow_mut()) {
        *kill_switch.borrow_mut() = true;
        bubbles.into_iter().for_each(|bubble| {
            dbg!(bubble);
        });
    }
})

请注意,您还需要将RefCell作为依赖项添加到项目中。

相关问题