Arc<Mutex>
でスレッド間で共有されているVec<String>
オブジェクトがあります。私は、現在の値を取得し、別の場所で別のベクトルにそれを追加し、それをクリアしたい:ベクトルをミューテックスに別のベクトルに追加できません
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
オブジェクトであるため、機能しません。オブジェクト全体を反復して各要素を追加できますが、範囲外になる前に値をクリアしていると考えると、より効率的な方法がありますか?
あなたはまた、:: 'MEMを使用して置き換えることができます(&MUT * lines_result、Vecを::新しい())'移動することが'&mut'の後ろからベクトルを取り出し、それを空のものに置き換えます。 – sellibitze