我有一个巨大的向量,我希望能够并行加载/操作,例如,在一个线程中加载前十万个索引,在另一个线程中加载下一个,依此类推.由于这将成为代码中非常热门的一部分,我已经提出了以下概念验证不安全代码,以便在没有Arcs和Mutexes的情况下执行此操作:
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
});
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么可以使这可能爆炸吗?
这使用#![feature(unique)]所以我不知道如何在稳定中使用它.有没有办法在稳定中做这种事情(理想情况下安全,不使用原始指针和开销的Arc's和Mutex's)?
另外,看一下 文档Unique,它说
它还意味着如果没有引用的唯一路径,则不应修改指针的
Unique引用
我不清楚"独特路径"是什么意思.
我试图教自己一些生锈,并写了一些看起来像:
let args:Vec<String> = env::args().collect();
let parsed = parser::sys(args.as_slice());
Run Code Online (Sandbox Code Playgroud)
...
pub fn sys<'a>(args:&'a [String]) -> Parsed<'a> {
parsed(args)
}
Run Code Online (Sandbox Code Playgroud)
哪个parsed是解析和加载配置的函数.
这很好用.现在我试图抽象地在调用中显式调用env::args()和隐藏它sys,所以我写了一个新版本sys
pub fn sys<'a>() -> Parsed<'a> {
let args:Vec<String> = env::args().collect();
parsed(args.as_slice())
}
Run Code Online (Sandbox Code Playgroud)
这失败了:
error: `args` does not live long enough
src/test.rs:66 parsed(args.as_slice())
Run Code Online (Sandbox Code Playgroud)
我认为错误是因为编译器无法推断我希望这个新创建的结构的生命周期是我想要将其移入的变量的生命周期.它是否正确?如何在此返回值上注释生命周期/修复此问题?
我有一个u8我想要解释为矢量的矢量u32.假设字节顺序正确.我不想在转换后分配新内存和复制字节.我得到以下工作:
use std::mem;
fn reinterpret(mut v: Vec<u8>) -> Option<Vec<u32>> {
let v_len = v.len();
v.shrink_to_fit();
if v_len % 4 != 0 {
None
} else {
let v_cap = v.capacity();
let v_ptr = v.as_mut_ptr();
println!("{:?}|{:?}|{:?}", v_len, v_cap, v_ptr);
let v_reinterpret = unsafe { Vec::from_raw_parts(v_ptr as *mut u32, v_len / 4, v_cap / 4) };
println!("{:?}|{:?}|{:?}",
v_reinterpret.len(),
v_reinterpret.capacity(),
v_reinterpret.as_ptr());
println!("{:?}", v_reinterpret);
println!("{:?}", v); // v is still alive, but is same as rebuilt
mem::forget(v);
Some(v_reinterpret)
}
} …Run Code Online (Sandbox Code Playgroud) 我试图理解对象安全的想法.我从文档中知道,对象安全是以下保持:
Self: Sized如果物体安全所需的两个条件中的任何一个被丢弃,那么可以想象可以导致安全失败的安全保证可以实现什么?