我有一个巨大的向量,我希望能够并行加载/操作,例如在一个线程中加载前十万个索引,然后在另一个线程中加载下一个索引,依此类推。由于这将是代码中非常热门的部分,因此我提出了以下概念验证不安全代码来在不使用 Arcs 和互斥体的情况下执行此操作:
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 and Mutex
's)?
另外,看着的文档Unique https://doc.rust-lang.org/std/ptr/struct.Unique.html, 它说
它还意味着如果没有指向指针的唯一路径,则不应修改指针的所指对象。Unique
参考
我不清楚“唯一路径”是什么意思。
今天的rayon https://crates.io/crates/rayoncrate 是此类事物的事实上的标准:
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
with iter_mut
.
也可以看看用 Rust 和 Zig 编写一个小型光线追踪器 https://nelari.us/post/raytracer_with_rust_and_zig/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)