gpt4 book ai didi

multithreading - 在线程之间传递 hashmap 的 channel |陷入循环 | rust

转载 作者:行者123 更新时间:2023-12-03 11:36:29 24 4
gpt4 key购买 nike

我正在为网站 Exercism in rust 解决一个问题,我基本上尝试同时计算某些文本中不同字母出现的次数。我通过在线程之间传递 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;
}

最佳答案

迭代接收者 rx 将在发送者存在时阻止新消息。克隆到线程中的那些将在完成后退出范围,但原始发件人 tx 仍在范围内。

您可以通过手动删除 tx 使其超出范围:

for _i in 0..worker_count {
...
}

std::mem::drop(tx); // <--------

for received in rx {
...
}

关于multithreading - 在线程之间传递 hashmap 的 channel |陷入循环 | rust ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65649189/

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