【发布时间】:2011-05-08 06:13:49
【问题描述】:
我正在编写一个需要递归搜索文件夹结构的程序,并希望与多个线程并行进行。
我已经编写了相当简单的同步方法 - 最初将根目录添加到队列中,然后将目录出队,将其子目录排队等,直到队列为空。我将为我的队列使用ConcurrentQueue<T>,但我已经意识到我的循环会过早停止。第一个线程将使根目录出队,然后所有其他线程立即可以看到队列为空并退出,使第一个线程成为唯一运行的线程。我希望每个线程循环直到队列为空,然后等到另一个线程将更多目录排队,然后继续。我的循环中需要某种检查点,这样在每个线程都到达循环结束之前,没有一个线程会退出,但是当真的没有更多目录时,我不确定在没有死锁的情况下执行此操作的最佳方法过程。
【问题讨论】:
-
您能详细说明您在文件夹结构中搜索的内容吗?只是一个文件名或文件内的东西?还是别的什么?我认为这对于帮助您使用适当的算法至关重要
-
你这样做是为了性能吗?我查看了读取数千个文件的进程的类似情况,发现控制性能因素是磁盘 IO,并行线程中的处理不会显着影响性能。
-
我将目录名称或其中的文件与正则表达式进行匹配,然后返回结果 - 我没有匹配文件中的任何内容。我可能会扩展它以检查文件属性,但仅此而已。
-
@ScruffyDuck - 是的,我这样做是出于性能原因,但正如我所说,我实际上并没有打开文件,只是测试它的文件名和属性。这是否应该使并行化更有效?
-
我原以为,如果您对每个文件进行最少的处理,那么这将减少使用多个线程,而不是更有效地提高性能。在我看来,您需要对每个文件进行的处理越多,系统 IO 的影响就越小,使用多个线程来处理文件就越有用。
标签: c# queue deadlock parallel-processing