У меня есть объект Vec<String>
, который делится между потоками через Arc<Mutex>
. Я хочу взять его текущее значение и добавить его в другой вектор в другом месте, а затем очистить его:Невозможно добавить вектор в мьютексе другому вектору
use std::thread;
use std::sync::{Arc, Mutex};
struct Store {
lines: Vec<String>
}
fn main() {
let mut store = Store { lines: vec![] };
let lines = Arc::new(Mutex::new(vec!["Initial value".to_string()]));
let lines_clone = lines.clone();
let t2 = thread::spawn(move || {
// populate lines
});
let t1 = thread::spawn(move || {
let mut lines_result = lines_clone.lock().unwrap();
store.lines.extend(lines_result); // This will not work
lines_result.clear();
});
let _ = t1.join();
let _ = t2.join();
}
extend
не будет работать, потому что lines_result
фактически MutexGuard
объект. Я могу перебирать объект и добавлять каждый элемент, но учитывая, что я очищаю его значения до того, как он выходит из сферы действия, существует ли более эффективный способ?
Вы также можете использовать 'ает :: заменить (& ает * lines_result, Vec :: нового())' для перемещения выведите вектор из-за '& mut' и замените его на пустой. – sellibitze