C++ 基于多线程的巨树结构文件查找方法

C++ 基于多线程的巨树结构文件查找方法,c++,c,C++,C,我有一棵树,它的所有目录和文件都是它的节点。我想搜索一个特定的文件。假设这棵树分布很广,我想做一个广度优先的搜索,找到一些特定的文件,也就是使用多线程。我应该如何使用多线程来实现这一点?什么是好方法?假设树中的每个节点代表一个目录(以及其中的文件),并且假设可以打开的线程数量没有限制: 输入根节点,如果它有n子目录,则创建n-1线程以在第一个n-1中搜索,并在最后一个子目录中继续搜索。根据需要重复。假设树中的每个节点代表一个目录(以及其中的文件),并且假设可以打开的线程数没有限制: 输入根节点,

我有一棵树,它的所有目录和文件都是它的节点。我想搜索一个特定的文件。假设这棵树分布很广,我想做一个广度优先的搜索,找到一些特定的文件,也就是使用多线程。我应该如何使用多线程来实现这一点?什么是好方法?

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


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

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


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

多线程处理每个分支中具有未知工作分布的树搜索任务是非常重要的(例如,约束满足问题)


最简单的方法是创建一个任务队列(受互斥锁保护)。用根节点的所有子节点填充该队列。生成N个线程(每个可用CPU核心一个线程),并让它们在每个节点中搜索。您可以使用各种技巧来避免一些不好的情况(如果任何线程发现其节点“出乎意料地深”,您可以让它们将新任务添加到队列中,对应于它希望其他线程探索的子目录。)如果您的节点深度分布良好,并且根节点有很多子节点,那么您可以完全避免队列——只需为每个具有索引i的线程分配探索X%N+i(其中X是根节点的子节点数)的任务。

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


最简单的方法是创建一个任务队列(受互斥锁保护)。用根节点的所有子节点填充此队列。生成N个线程(每个可用CPU内核一个线程),并让它们在每个节点中搜索。可以使用各种技巧来避免一些不好的情况(如果任何线程发现其节点“出乎意料地深”)您可以让他们将新任务添加到队列中,该队列对应于它希望其他线程探索的子目录。)如果您的节点深度分布良好,并且根节点有很多子节点,则可以完全避免队列--只需将探索X%N+i的任务分配给索引为i的每个线程即可(其中X是根节点的子节点数。)

我的第一个回答是“只使用nftw,忘记多线程”。如果您碰巧有一个nftw的实现,它以多线程方式运行树,那么您可以免费获得多线程(我不知道有任何这样的实现).如果您真的想执行多个线程,我建议您使用nftw并为回调中的每个目录生成一个新线程,但目前还不清楚这是否更容易(或有任何不同)而不是遵循Kanopus的建议。在考虑了一会儿之后,我回到了我的第一个建议,想知道为什么要使用多个线程来执行此操作。拥有更多线程不太可能加快搜索速度。使用nftw。不要担心线程问题。

我的第一个反应是“只需使用nftw,忘记多线程”。如果您碰巧有一个nftw实现,它以多线程方式执行树遍历,那么您可以免费获得多线程(我不知道有任何这样的实现).如果您真的想执行多个线程,我建议您使用nftw并为回调中的每个目录生成一个新线程,但目前还不清楚这是否更容易(或有任何不同)而不是遵循Kanopus的建议。在考虑了一会儿之后,我回到了我的第一个建议,想知道为什么要对多个线程执行此操作。拥有更多线程不太可能加快搜索速度。使用nftw。不要担心线程问题。

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

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

在某些情况下,多线程搜索将提供有用的加速—例如,如果树跨越多个磁盘,或者如果某些磁盘/节点通过某个网络间接连接奥克

我当然不想尝试为每个文件夹创建线程。这是数千个创建/运行/终止,数千个堆栈分配/释放等。总的,可避免的开销

可以进行多线程搜索,但正如其他海报所说,请先查看可用的备选方案。然后阅读本文的其余部分。然后再查看

我曾经使用类似Matt建议的队列方法做过类似的事情

我不想