gpt4 book ai didi

multithreading - 如何让一个线程从 HashMap 中删除而另一个线程插入?

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

我有一个散列:

let mut hash: HashMap<String, Vec<i32>> = HashMap::new();

然后我开始一个话题:

thread::spawn(move || delete_from(&mut hash));

fn delete_from(m: &mut HashMap<String, Vec<i32>>) {
loop {
m.remove(a_key)
}
}

这很好用。我有一个 sleep 语句(未显示),它正确地生成了 a_key 并将其从 HashMap 中删除。当我打印出来时,我可以看到线程慢慢地移除了每个项目。

我想开始第二个线程:

thread::spawn(move || insert_into(&mut hash));

fn insert_into(m: &mut HashMap<String, Vec<i32>>) {
loop {
m.insert(a_string, a_vector);
}
}

也就是插入。但是当我添加第二个线程时,我得到:

capture of moved value: hash [E0382]

设置它的正确方法是什么?

The complete code .

最佳答案

事实上,hashmap 被移动到第一个线程中,所以其他线程不能访问它。您需要一个用于共享所有权的 Arc,以便多个线程可以访问 map ,还需要一个用于同步的 Mutex,这样它们就不会同时尝试修改同时显示 map 。

这是它的样子:

use std::sync::{Arc, Mutex};

let hash: Arc<Mutex<HashMap<String, Vec<i32>>>> = Arc::new(Mutex::new(HashMap::new())); // initialize the map within an Arc (for sharing) and a Mutex (for synchronization)
let clone1 = hash.clone(); // clone the Arc so it can be owned jointly by multiple threads
let clone2 = hash.clone(); // clone the Arc so it can be owned jointly by multiple threads

thread::spawn(move || delete_from(&clone1));
thread::spawn(move || insert_into(&clone2));

fn delete_from(m: &Mutex<HashMap<String, Vec<i32>>>) {
loop {
m.lock().unwrap().remove(a_key); // lock the mutex, remove a value, unlock
}
}

fn insert_into(m: &Mutex<HashMap<String, Vec<i32>>>) {
loop {
m.lock().unwrap().insert(a_string, a_vector); // lock the mutex, insert a value, unlock
}
}

关于multithreading - 如何让一个线程从 HashMap 中删除而另一个线程插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39045636/

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