Я пытаюсь создать несколько новых потоков, где каждый поток получает собственную копию некоторого состояния. Я хочу вот что:
use std::thread;
fn main() {
let data = vec![42; 10];
let more_data = "Important data".to_string();
for _ in 1..=4 {
thread::spawn(|| foo(data.clone(), more_data.clone()));
}
}
fn foo(_data: Vec<u64>, _more_data: String) {}
Это не компилируется, потому что клон выполняется в новом потоке, который может пережить основной поток. Справедливо, но, похоже, нет хорошего способа сказать Rust сделать клон в главном потоке, и затем перенести владение в новый поток. Всякий раз, когда я сталкиваюсь с этой проблемой, я заканчиваю этим:
use std::thread;
fn main() {
let data = vec![42; 10];
let more_data = "Important data".to_string();
for _ in 1..=4 {
let cloned_data = data.clone();
let cloned_more_data = more_data.clone();
thread::spawn(move || foo(cloned_data, cloned_more_data));
}
}
fn foo(_data: Vec<u64>, _more_data: String) {}
Он делает то, что я хочу, но он очень шумный и шумный, особенно с большим количеством аргументов. Есть ли лучший способ?