我正在为rust中的Exercism网站解决一个问题,在那里我基本上是试图同时计算在一些文本中出现多少次不同的字母。我是通过在线程之间传递hashmap来做到这一点的,不知何故,我正处于某种无限循环中。我想问题出在我对接收器的处理上,但我真的不知道。请帮帮忙。
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;
}发布于 2021-01-10 09:33:12
当发送者存在时,在接收者上迭代rx将阻止新消息。克隆到线程中的tx将在完成后退出作用域,但原始发送者‘re仍在作用域中。
您可以通过手动删除tx来强制它超出作用域:
for _i in 0..worker_count {
...
}
std::mem::drop(tx); // <--------
for received in rx {
...
}https://stackoverflow.com/questions/65649189
复制相似问题