Я пытаюсь создать заданный набор потоков и каждый из них выполняет длительную операцию. Я бы передал структуру каждому рабочему потоку в качестве внутреннего состояния данного потока. Сбор указанных структур хранится в векторе, являющемся частью структуры Master
.Ссылка на элемент поля
компилятор отвергает меня передавая внутренний член структуры в Arc::new()
:
use std::thread;
use std::sync::Arc;
struct Worker {
name: String,
}
struct Master {
workers: Vec<Worker>,
}
impl Worker {
fn start(&self) {
println!("My name is {} and I'm working!", self.name);
thread::sleep_ms(100_000);
}
}
impl Master {
pub fn run_test(&mut self) {
for i in 0..10 {
self.workers.push(Worker {
name: String::new() + "Worker" + &i.to_string()
});
}
let mut data = Arc::new(self.workers);
for i in 0..10 {
let local_data = data.clone();
thread::spawn(move || {
local_data[i].start();
});
}
thread::sleep_ms(100_000);
}
}
fn main() {
let mut master = Master { workers: vec![] };
}
Сообщение об ошибке:
error[E0507]: cannot move out of borrowed content
--> <anon>:26:33
|
26 | let mut data = Arc::new(self.workers);
| ^^^^ cannot move out of borrowed content
Что я делаю неправильно? Это идиоматическая ржавчина?
Что именно вы хотите с этим «дугой»? «Рабочий вектор»? 'Arc' нуждается в собственности того, с чем он управляет, но вы не можете предоставить право собственности, потому что у вас есть только заимствование вектора. Есть много вопросов с сообщением об ошибке «не может выйти из заимствованного контента»] (http://stackoverflow.com/search?q=%5Brust%5D+%22cannot+move+out+of+borrowed+content%22) уже. Может быть, один из них может вам помочь? –
Также: интерполяция строк в Rust обычно не выполняется с помощью '+' оператора, а с 'format!()'. Вы можете заменить свою странную строку 'name: format! (« Worker {} ", i)'. Это делает то же самое, выглядит более чистым и позволяет избежать ненужных распределений кучи. –
Я действительно пытаюсь управлять рабочим вектором. Моя идея заключалась в том, что каждый поток будет рабочим и будет содержать структуру рабочего, поскольку это внутреннее состояние, в то время как мастер сохраняет ссылку на вектор работников. – Dash83