我有一个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();
}
Run Code Online (Sandbox Code Playgroud)
extend不会起作用,因为lines_result它实际上是一个MutexGuard对象.我可以迭代对象并附加每个元素,但考虑到我在超出范围之前清除它的值,是否有更有效的方法?
您可以使用Vec::drain()将其所有内容移出到迭代器中,这样您就可以使用它.extend()并同时清除原始向量.
move || {
let mut lines_result = lines_clone.lock().unwrap();
store.lines.extend(lines_result.drain(..));
}
Run Code Online (Sandbox Code Playgroud)
您可以使用Vec::append()将所有元素从一个向量移动到另一个向量的末尾.
store.lines.append(&mut lines_clone.lock().unwrap());
Run Code Online (Sandbox Code Playgroud)