我有一个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] = /* ... */;
}
一个可能的选择是拥有多个向量,并将每个向量传递给每个线程,并且一旦线程连接在一起,就将这些向量连接起来,但是除非有将子向量移动到最终向量的方法,否则这将需要额外的内存。向量而不是复制它们。
是否有任何替代方法可以让我仅锁定向量的特定部分,或者在级联时移动多个子向量(我的目标是最终使用单个向量),或者可以安全地编写任何其他替代方法进入向量?