gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:01:26 26 4
gpt4 key购买 nike

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

最佳答案

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

move || {
let mut lines_result = lines_clone.lock().unwrap();
store.lines.extend(lines_result.drain(..));
}

关于rust - 无法将互斥量中的向量附加到另一个向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39246458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com