相关疑难解决方法(0)

并行处理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
查看次数

一个可变借用和多个不可变借用

我正在尝试编写一个程序,它生成一个后台线程,不断地将数据插入到某个集合中.同时,我想继续获取输入stdin并检查该输入是否在线程正在运行的集合中.

这是一个简单的例子:

use std::collections::HashSet;
use std::thread;

fn main() {
    let mut set: HashSet<String> = HashSet::new();

    thread::spawn(move || {
        loop {
            set.insert("foo".to_string());
        }
    });

    loop {
        let input: String = get_input_from_stdin();

        if set.contains(&input) {
            // Do something...
        }
    }
}

fn get_input_from_stdin() -> String {
    String::new()
}
Run Code Online (Sandbox Code Playgroud)

但是由于所有权的原因,这不起作用.

我还是Rust的新手,但这似乎应该是可行的.我只是找不到正确的Arcs,Rcs,Mutexes等组合来包装我的数据.

concurrency multithreading ownership rust

3
推荐指数
1
解决办法
342
查看次数