这是一个示例图形,其中包含任务A
,B
,C
,D
。总有1个终端节点。在实际应用中,图可能有数千个节点。
C ---.
\
A ----------------> D
\ /
`--> B ---`
A
没有依赖关系;它可以立即运行B
取决于A是否先完成。因此,如果它与A
在同一线程上运行,则无需等待。如果它与A
位于不同的线程上,则需要同步。C
没有依赖性,因此可以立即运行D
取决于A
,B
和C
,其完成标志着整个图的完成我尝试了几种简易的方法,这些方法可以正常工作,但是我觉得这是一个问题,已经存在最佳解决方案了。
具体来说,这是Windows上的C ++音频应用程序,节点图表示将在缓冲区上连续运行的DSP电路。因此,例如,到目前为止,我发现的最佳技术根据图中节点的时间为N个线程生成了一个执行计划。该计划可以生成一次,然后循环执行。
编辑
到目前为止,我尝试过的最好的技术是执行以下操作:
我尝试的另一种技术是仅允许工作人员从拓扑排序的列表中请求下一个可用节点。这是快速的方法,但与提前制定计划并不相近。
我认为我的解决方案不是最优的原因是因为有许多方法可以对图进行拓扑排序,这将产生不同的执行计划。因此,即使我的方法是最优的,我的实现也可能不是因为我暂时没有任何优化策略来生成列表。
我认为等待时间最少的执行计划是最佳选择,但是我觉得我在不断完善自己。