我有一个庞大的向量,希望能够并行加载/操作,例如,在一个线程中加载前十万个索引,在另一个线程中加载下一个,依此类推。由于这将是代码中非常热门的部分,因此我提出了以下以下概念证明不安全的代码,以在没有Arcs和Mutexs的情况下执行此操作:
let mut data:Vec<u32> = vec![1u32, 2, 3];
let head = data.as_mut_ptr();
let mut guards = (0..3).map(|i|
unsafe {
let mut target = std::ptr::Unique::new(head.offset(i));
let guard = spawn(move || {
std::ptr::write(target.get_mut(), 10 + i as u32);
});
guard
});
我在这里想念的东西有什么可能会使它爆炸吗?
这会用到,#![feature(unique)]
所以我看不到如何稳定地使用它。有没有办法稳定地执行这种操作(理想情况下是安全的,而不使用原始指针和Arc
's和Mutex
's的开销)?
此外,查看有关的文档Unique
,它说
这也意味着,如果没有指向引用的唯一路径,则不应修改指针的
Unique
引用。
我不清楚“独特的道路”是什么意思。
今天,rayon
板条箱已成为这类事情的事实上的标准:
use rayon::prelude::*;
fn main() {
let mut data = vec![1, 2, 3];
data.par_iter_mut()
.enumerate()
.for_each(|(i, x)| *x = 10 + i as u32);
assert_eq!(vec![10, 11, 12], data);
}
请注意,这与使用标准迭代器的单线程版本仅有一行不同,后者将替换par_iter_mut
为iter_mut
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句