无法将互斥体中的向量附加到另一个向量

vis*_*ise 2 mutex rust

我有一个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对象.我可以迭代对象并附加每个元素,但考虑到我在超出范围之前清除它的值,是否有更有效的方法?

ken*_*ytm 9

您可以使用Vec::drain()将其所有内容移出到迭代器中,这样您就可以使用它.extend()并同时清除原始向量.

move || {
    let mut lines_result = lines_clone.lock().unwrap();
    store.lines.extend(lines_result.drain(..));
}
Run Code Online (Sandbox Code Playgroud)


blu*_*uss 7

您可以使用Vec::append()将所有元素从一个向量移动到另一个向量的末尾.

store.lines.append(&mut lines_clone.lock().unwrap());
Run Code Online (Sandbox Code Playgroud)