如何在多个线程中修改向量的每个部分

时间:2018-09-26 17:29:48

标签: multithreading rust locking

我有一个u8的向量,我需要用可以并行计算的值来填充这个向量:

let vector: Vec<u8> = vec![0, len];

给定n_threads个线程,每个线程可以处理向量的一部分。我知道将可变向量传递到多个线程中的唯一方法是将其包装到Mutex中:

let vector: Arc::new(Mutex::new(vec![0, len]));

,然后为每个线程移动原子引用的克隆:

for _ in 0..n_hthreads {
    let vector = Arc::clone(&vector);
    thread::spawn(move || fill_vector());
}

这种方法的问题是我需要将整个向量锁定在线程内部(这完全使并行性无效):

fn fill_vector() {
    let vector = vector.lock().unwrap();
    vector[i] = /* ... */;
}

一个可能的选择是拥有多个向量,并将每个向量传递给每个线程,并且一旦线程连接在一起,就将这些向量连接起来,但是除非有将子向量移动到最终向量的方法,否则这将需要额外的内存。向量而不是复制它们。

是否有任何替代方法可以让我仅锁定向量的特定部分,或者在级联时移动多个子向量(我的目标是最终使用单个向量),或者可以安全地编写任何其他替代方法进入向量?

0 个答案:

没有答案