首页 > 解决方案 > Rust 中大内存块的并行初始化

问题描述

做这个的最好方式是什么:

我有一个需要用一些数据初始化的 2GiB 内存块。数据都是独立的,因此我可以轻松地生成 n 个线程来并行初始化数据,每个线程在单独的内存位置上工作。

我怎样才能“告诉”这个 Rust。它不允许我在线程之间共享内存(有充分的理由和正当的)。我知道不会有竞争条件,因为每个线程都在完全独立的内存位置上工作。

一种想法是使用(横梁)通道。每个线程将计算发送给一个将内存放入正确位置的写入器。唉,这感觉过于复杂且不够高效。是否有某种方法可以为线程划分内存以使其安全地使用不同的线程?

标签: multithreadingrust

解决方案


并行性的首选板条箱是rayon,它可以使这变得简单:

use rayon::prelude::*;

// this just takes a big zeroed buffer and fills it with 1s with 10 threads
fn main() {
    let mut data = vec![0u8; 2000000]; // pretend this is 2 GiB
    data.chunks_mut(200000) // pretend this is 2 GiB / N threads
        .par_bridge()
        .for_each(|d| d.fill(1));
}

slice的chunks_mut()功能已经可以为您提供许多可变切片来分隔原始区域。然后这只是用于par_bridge()将其转换为并行迭代器。


推荐阅读