如何解决线程间传递hashmap的通道|陷入循环|锈
我正在为网站 Exercism in rust 解决一个问题,我基本上尝试同时计算某些文本中不同字母出现的次数。我通过在线程之间传递哈希图来做到这一点,并且不知何故处于某种无限循环中。我认为问题在于我对接收器的处理,但我真的不知道。请帮忙。
use std::collections::HashMap;
use std::thread;
use std::sync::mpsc;
use std::str;
pub fn frequency(input: &[&str],worker_count: usize) -> HashMap<char,usize> {
// Empty case
if input.is_empty() {
return HashMap::new();
}
// Flatten input,set workload for each thread,create hashmap to catch results
let mut flat_input = input.join("");
let workload = input.len() / worker_count;
let mut final_map: HashMap<char,usize> = HashMap::new();
let (tx,rx) = mpsc::channel();
for _i in 0..worker_count {
let task = flat_input.split_off(flat_input.len() - workload);
let tx_clone = mpsc::Sender::clone(&tx);
// Separate threads ---------------------------------------------
thread::spawn(move || {
let mut partial_map: HashMap<char,usize> = HashMap::new();
for letter in task.chars() {
match partial_map.remove(&letter) {
Some(count) => {
partial_map.insert(letter,count + 1);
},None => {
partial_map.insert(letter,1);
}
}
}
tx_clone.send(partial_map).expect("Didn't work fool");
});
// --------------------------------------------------
}
// iterate through the returned hashmaps to update the final map
for received in rx {
for (key,value) in received {
match final_map.remove(&key) {
Some(count) => {
final_map.insert(key,count + value);
},None => {
final_map.insert(key,value);
}
}
}
}
return final_map;
}
解决方法
当发送者存在时,在接收者 rx
上迭代将阻止新消息。您克隆到线程中的那些将在完成后退出范围,但原始发件人 tx
仍在范围内。
您可以通过手动删除 tx
强制超出范围:
for _i in 0..worker_count {
...
}
std::mem::drop(tx); // <--------
for received in rx {
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。