【发布时间】:2015-04-07 01:01:02
【问题描述】:
我在 C# 中有一个任务,需要递归计算树状结构中项目的属性。基本上,我只是进行递归深度优先搜索,但使用线程来并行化该过程。这意味着,从树的根开始,我启动N 线程,每个根的子项一个(最多可用线程的最大值,我们将说是L)。因此,如果N 严格大于L,我将有(N - L) 根子级等待处理,这将最终逐渐发生,因为函数一直向上返回,线程终止并被回收到处理下一个根子元素(如果有任何未处理的)。
我只是考虑一个或多个原始线程的运行时间相对较长的情况,足以让其他根子(及其后代)有时间在这个或那些线程有时间之前处理去完成。这意味着我将有潜在的可用线程在不做任何工作的情况下放置。
我想要完成的是实际使用这些线程来加速更长运行的执行路径。我在想Open MPI,实际上你总是可以让所有可用线程动态地处理剩余的任务。这意味着,在每次调用递归方法之前,我应该以某种方式检查是否所有根子节点都已被处理(因为它们是优先级),如果是这样,则生成递归调用的线程版本,然后移动继续下一个。
我试图在下面的(画得很差的)图表中说明这种行为(其中每个横向分支都是递归方法调用/返回)。第一张图片显示了thread2 完成的速度比thread1 快得多的情况,然后只是闲置而没有任何进一步的贡献。第二张图片显示了所需的行为,在进行下一个递归调用之前,我们实际上使用可用线程对其进行线程化,然后继续处理下一个子进程。第 n 级部分只是意味着它可以在递归中走得更深。
您知道是否有任何方法可以在 C# 中促进此过程?就代码的并行化(在构造、数据结构等方面)而言,最好的策略是什么?另外,是否有一种简单的方法可以“减少”(聚合)计算结果?
【问题讨论】:
标签: c# multithreading recursion