首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >线程间传递hashmap的通道|卡住循环|生锈

线程间传递hashmap的通道|卡住循环|生锈
EN

Stack Overflow用户
提问于 2021-01-10 08:58:03
回答 1查看 115关注 0票数 2

我正在为rust中的Exercism网站解决一个问题,在那里我基本上是试图同时计算在一些文本中出现多少次不同的字母。我是通过在线程之间传递hashmap来做到这一点的,不知何故,我正处于某种无限循环中。我想问题出在我对接收器的处理上,但我真的不知道。请帮帮忙。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-10 09:33:12

当发送者存在时,在接收者上迭代rx将阻止新消息。克隆到线程中的tx将在完成后退出作用域,但原始发送者‘re仍在作用域中。

您可以通过手动删除tx来强制它超出作用域:

代码语言:javascript
复制
for _i in 0..worker_count {
    ...
}

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

for received in rx {
    ...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65649189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档