使用多线程查找巨大树结构中的文件的方法

时间:2011-06-01 01:23:14

标签: c++ c

我有一棵树,其中包含所有目录和文件作为其节点。我想搜索特定的文件。假设树广泛传播,我想做广泛的第一次搜索以找到一些特定的文件,这也是使用多线程。我应该如何使用多线程?什么是好方法?

5 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

对每个分支中具有未知工作分布的树搜索任务进行多线程处理是非常重要的(这就出现了很多问题,即约束满足问题。)

最简单的方法是创建一个任务队列(由互斥锁保护。)使用根节点的所有子节点填充此队列。产生N个线程(每个可用CPU核心一个)并让它们搜索每个节点。您可以采取各种措施来避免一些不良情况(如果任何线程发现其节点“意外深入”,您可以让它们将新任务添加到与其希望其他线程探索的子目录相对应的队列中。)如果您的节点深度分布良好,根节点有很多孩子,你可以完全避免队列 - 只需为每个线程分配索引i探索X%N + i的任务(其中X是根节点的子节点数。)< / p>

答案 2 :(得分:1)

我的第一反应就是说“只使用nftw而忘记多线程”。如果你碰巧有一个nftw的实现,树以多线程方式行走,那么你可以免费获得多线程(我不知道任何这样的实现)。如果你真的想做多个线程,我会建议使用nftw并为回调中的每个目录生成一个新线程,但是不能立即明白这比遵循Kanopus的建议更容易(或任何不同)。在考虑了一会儿之后,我回到了我的第一个建议,并想知道为什么你想用多个线程做这个。拥有更多线程不太可能加快搜索速度。使用nftw。不要担心线程。

答案 3 :(得分:0)

假设树中的每个节点代表一个目录(及其中的文件),并且假设您可以打开的线程数没有限制:

输入根节点,如果它有n子目录,则创建n - 1个线程以在第一个n - 1中搜索并继续搜索最后一个子目录。根据需要重复。

答案 4 :(得分:0)

树结构通常不适合并行化。假设你已经将所有节点加载到内存中,尝试组织它们以便它们占用一个数组 - 毕竟,它们需要存在于串行的RAM中 - 并忽略它们的树结构以用于搜索。然后使用某种并行的for循环遍历数组的元素。一个流行的选择是OpenMP,或者您可以在Visual Studio中尝试parallel_for_each