如何解决使用索引数组并行写入数组 编辑
我无法理解来自C ++的Rust中的并发模型。
我的数组将使用另一个定义索引的数组并发访问。例如(伪代码):
let indices = [1,2,3,4,1,2];
let mut arr = [1,5,6,7,8,10];
indices.iter_par().for_each(|x| {
arr[x] += x;
});
在C ++中,我将使用锁保护arr
中的每个索引或使用原子访问。我如何在Rust中做同样的事情?
编辑
我还有另一个相关问题。
我如何将可变的普通数组传递到并行迭代器中,我可以确定不会出现竞争条件?
let indices = [1,8];
let mut arr = [1,9,10];
indices.iter_par().for_each(|x| {
arr[x] = some_function(x);
});
解决方法
如果您需要为每个项目锁定,我不知道并行执行此操作的意义是什么,但是您可以在数组周围使用Mutex
来进行突变:
use rayon::prelude::*;
use std::sync::Mutex;
fn main() {
let indices = [1,2,3,4,1,2];
let arr = Mutex::new([1,5,6,7,8,10]);
indices.par_iter().for_each(|&x| {
let mut arr = arr.lock().unwrap();
arr[x] += x;
});
}
编辑
基于注释,您可以使每个元素都是原子的:
use rayon::prelude::*;
use std::sync::atomic::{AtomicUsize,Ordering};
fn main() {
let indices = [1,2];
let arr = [1,10]
.iter()
.map(|&n| AtomicUsize::new(n))
.collect::<Vec<_>>();
indices.par_iter().for_each(|&x| {
arr[x].fetch_add(x,Ordering::SeqCst);
});
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。