Эмпирически видно, что такое поведение не гарантируется:
use rayon::prelude::*; // 1.0.3
use std::thread;
fn main() {
let ids: Vec<_> = (0..2)
.into_par_iter()
.map(|_| thread::current().id())
.collect();
println!("{:?}", ids);
}
Различные прогоны программы показывают:
[ThreadId(1), ThreadId(2)]
[ThreadId(1), ThreadId(1)]
[ThreadId(2), ThreadId(1)]
[ThreadId(2), ThreadId(2)]
При этом вы должны выполнить свой собственный сравнительный анализ.По умолчанию Rayon создает глобальный пул потоков и использует кражу работы, чтобы сбалансировать работу между потоками.Пул потоков - это единовременная стоимость установки на процесс, а кража работы помогает гарантировать, что работа пересекает границы потоков только при необходимости.Вот почему есть выходы выше, где оба используют один и тот же поток.