小编sgl*_*div的帖子

并行处理vec:如何安全地进行,或者不使用不稳定的功能?

我有一个巨大的向量,我希望能够并行加载/操作,例如,在一个线程中加载前十万个索引,在另一个线程中加载下一个,依此类推.由于这将成为代码中非常热门的一部分,我已经提出了以下概念验证不安全代码,以便在没有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引用

我不清楚"独特路径"是什么意思.

parallel-processing unsafe rust

9
推荐指数
2
解决办法
1548
查看次数

如何将返回值的生命周期设置为我移入其中的变量的生命周期?

我试图教自己一些生锈,并写了一些看起来像:

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)

我认为错误是因为编译器无法推断我希望这个新创建的结构的生命周期是我想要将其移入的变量的生命周期.它是否正确?如何在此返回值上注释生命周期/修复此问题?

rust

8
推荐指数
1
解决办法
2895
查看次数

如果我将Vec :: from_raw_parts调用的容量小于指针的实际容量,会发生什么?

我有一个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)

rust

7
推荐指数
1
解决办法
261
查看次数

如果不是为了物体安全,Rust会有什么安全保障?

我试图理解对象安全的想法.我从文档中知道,对象安全是以下保持:

  • 这个特性不需要 Self: Sized
  • 它的所有方法都是对象安全的

如果物体安全所需的两个条件中的任何一个被丢弃,那么可以想象可以导致安全失败的安全保证可以实现什么?

rust

2
推荐指数
1
解决办法
164
查看次数

标签 统计

rust ×4

parallel-processing ×1

unsafe ×1