并行更改二维向量

如何解决并行更改二维向量

我正在尝试使用crossbeam_utils版本0.8.0在二维矢量(图形)的每个位置设置值1。每个线程接收的子矩阵是不相交的。我在Windows上使用cargo run运行代码。我的代码基于这些question1question2。但是,出现以下错误

thread '<unnamed>' panicked at 'index out of bounds: the len is 3 but the index is 3'

但是,如果我在产生的线程中注释命令(*slice)[row][col] = 1,则可以看到线程在控制台中打印时工作正常。

什么原因导致此错误

use crossbeam_utils::thread;
use std::slice;

const NTHREADS: usize = 2;

fn build_graph() -> Vec<Vec<usize>> {

    let dictionary: Vec<String> = vec!["monk".to_string(),"mock".to_string(),"pock".to_string(),"pork".to_string(),"perk".to_string(),"perl".to_string()];
    let s_graph = dictionary.len();
    let mut graph: Vec<Vec<usize>> = vec![vec![0; s_graph]; s_graph];
    
    let chunk = f32::ceil(s_graph as f32 / NTHREADS as f32) as usize;
    let mut sliced_graph: Vec<&mut [Vec<usize>]> = Vec::with_capacity(NTHREADS);
    let ptr_graph = graph.as_mut_ptr();

    let mut offset;
    let mut count_of_items;
    
    // Creating mutable references for slices of the matrix
    for n_th in 0..NTHREADS {
        offset = n_th * chunk;
        count_of_items = if offset + chunk > s_graph { s_graph - offset } else { chunk };
        unsafe {
            sliced_graph.push(slice::from_raw_parts_mut(ptr_graph.offset((offset) as isize),count_of_items));
        }
    }

    thread::scope(|scope| {

        let mut n_th: usize = 0;
        let mut min_bound;
        let mut max_bound;

        for slice in &mut sliced_graph {
            
            min_bound = n_th * chunk;
            max_bound = if min_bound + chunk > s_graph { s_graph } else { min_bound + chunk};

            scope.spawn(move |_| {

                println!("thread number: {} - ini: {} - end: {}",n_th,min_bound,max_bound);

                for row in min_bound..max_bound {

                    for col in 0..s_graph {

                        println!("th:{} -->> set row:{} col:{}",row,col);
                        (*slice)[row][col] = 1;
                    }
                }

                println!("thread number: {} - Finished!",n_th);
            });

            n_th += 1;
        }
    }).unwrap();

    graph
} 

fn main() {
    build_graph();
}

解决方法

@Masklinn提出的解决方案:

use crossbeam_utils::thread;
use std::slice;

const NTHREADS: usize = 2;

fn build_graph() -> Vec<Vec<usize>> {

    let dictionary: Vec<String> = vec!["monk".to_string(),"mock".to_string(),"pock".to_string(),"pork".to_string(),"perk".to_string(),"perl".to_string()];
    let s_graph = dictionary.len();
    let mut graph: Vec<Vec<usize>> = vec![vec![0; s_graph]; s_graph];
    
    let chunk = f32::ceil(s_graph as f32 / NTHREADS as f32) as usize;
    let mut sliced_graph: Vec<&mut [Vec<usize>]> = Vec::with_capacity(NTHREADS);
    let ptr_graph = graph.as_mut_ptr();

    // Creating mutable references for slices of the matrix
    for n_th in 0..NTHREADS {
        let offset = n_th * chunk;
        let count_of_items = if offset + chunk > s_graph { s_graph - offset } else { chunk };
        unsafe {
            sliced_graph.push(slice::from_raw_parts_mut(ptr_graph.offset((offset) as isize),count_of_items));
        }
    }

    thread::scope(|scope| {
        for (n_th,slice) in sliced_graph.iter_mut().enumerate() {
            scope.spawn(move |_| {
                println!("thread number: {} - {:?}",n_th,slice);
                for (row,r) in slice.into_iter().enumerate() {
                    for (col,cell) in r.into_iter().enumerate() {
                        println!("th:{} -->> set row:{} col:{}",row,col);
                        *cell = 1;
                    }
                }

                println!("thread number: {} - Finished!",n_th);
            });
        }
    }).unwrap();
    graph
} 

fn main() {
    build_graph();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?