除了 kmdreko 推荐的优秀 Rayon crate 之外,还有一个更底层的能实现你想要的原语是slice::split_at_mut。您可以使用它将现有的可变切片拆分为多个可变切片,而无需使用不安全的代码:
let mut data = vec![0u8; 2_000_000]; // pretend this is 2 GiB
let mut data = &mut data[..];
let chunk_size = data.len() / n_threads;
for _ in 0..n_threads {
let (chunk, rest) = data.split_at_mut(chunk_size);
data = rest;
spawn(move |_| {
chunk.fill(1);
});
}
但是,要使其工作,您需要 作用域 线程,即允许引用借用值的线程。 (这是合理的,因为作用域线程会自动加入所有创建的线程,从而保证没有线程比借用的值更长。)
这是一个示例,使用与 kmdreko 的答案类似的设置:
use crossbeam_utils::thread;
fn main() {
let n_threads = 8;
let mut data = vec![0u8; 2_000_000]; // pretend this is 2 GiB
let mut data = &mut data[..];
let chunk_size = data.len() / n_threads;
thread::scope(|s| {
for _ in 0..n_threads {
let (chunk, rest) = data.split_at_mut(chunk_size);
data = rest;
s.spawn(move |_| {
chunk.fill(1);
});
}
})
.unwrap();
}
Playground