Чтобы не попасть в проблему XY, вот что я пытаюсь сделать:
- У меня есть
- общее
struct
с настройками и - дополнительная переменная настройка, с которой я хочу настроить и поиграть.
- Для всех возможных значений в целочисленном диапазоне я хочу начать (scoped) поток с этимпеременная установлена в это значение. (В зависимости от этого значения они выполняют немного различную работу).
- Однако каждый из этих потоков должен иметь возможность читать общую структуру настроек.
В псевдо-Rust:
extern crate crossbeam;
struct Settings {
// ... many fields
}
fn main() {
crossbeam::scope(|scope| {
for score in 0..max_feasible_score {
scope.spawn(|_| {
let work_result = do_cool_computation(&settings, score);
println!(work_result);
}
}
}).unwrap();
}
Теперь это не компилируется. Rust жалуется на то, что score
заимствовано в замыкании, которое может пережить его внешнюю функцию, и предлагает изменить аргумент scope.spawn
замыкания, чтобы преобразовать его в замыкание move || {...}
.
Однако это сделает недействительным &settings
, поскольку первая итерация цикла переходит во владение settings
в закрытие хода.
Единственный простой способ заставить его работать, это, например, скопировать структуру Settings
в каждый поток (который в моемреальное приложение довольно дорогое), или представьте дугу около settings
, что также кажется немного неудачным.
Есть ли способ, которым мы можем обойти подсчет ссылок здесь? Есть ли способ, которым мы можем переместиться score
во внутреннее закрытие, при этом все еще разрешено ссылаться на settings
?