Ian*_*Ian 5 c# parallel-processing heuristics
我希望得到一些关于线程管理的使用的建议,并希望任务并行库,因为我不确定我一直在走正确的路线.可能最好的是我概述了我要做的事情.
给定一个问题我需要使用基于启发式算法生成解决方案.我开始计算一个基本解决方案,这个操作我认为不能并行化,所以我们不需要担心.
一旦生成初始解决方案,我想触发n个线程,试图找到更好的解决方案.这些线程需要做一些事情:
我尝试了一个实现,包括管理我自己的线程并关闭它们等,但它开始变得非常复杂,我现在想知道TPL是否会更好.我想知道是否有人可以提供任何一般指导?
谢谢...
我肯定会看看 TPL。它允许您抽象您的问题。您可以考虑任务以及它们如何工作和共享数据,而不是在底层线程模型上花费大量时间并创建您的 wn 线程并管理它们。TPL 将允许您创建分配给线程池的任务。然后,TPL 管理该池并调整正在运行的任务数量以最大限度地提高性能。它将在各种硬件配置(核心)上执行此操作,这使得开发和应用变得更容易,并且在不同硬件之间移动时不需要进行重大重写。
还有很多事情需要考虑,特别是在共享状态方面。TPL 通常是比您自己实现更好的方法,除非您在线程方面非常有经验和/或有一些 TPL 不太适合的特殊情况应用程序。
1.它们需要使用不同的“优化指标”进行初始化。换句话说,他们试图优化不同的东西,并在代码中设置优先级。这意味着它们都运行略有不同的计算引擎。我不确定我是否可以通过 TPL 做到这一点..
您可以通过创建任务并向其传递不同的起始条件来做到这一点。
2.如果其中一个线程找到了比当前最知名的解决方案(需要在所有线程之间共享)更好的解决方案,那么它需要更新最佳解决方案,并强制许多其他线程重新启动(这又取决于优化指标的优先级)。
可以取消任务并开始新任务。
3.我可能还希望跨线程组合某些计算(例如,为解决问题的某种方法保留概率的并集)。但这可能是更可选的。
不确定我是否理解这个要求。
4.整个系统显然需要线程安全,我希望它运行得尽可能快。
即使使用 TPL,您也可以跨任务(线程)共享数据,那么您仍然有责任以线程安全的方式执行此操作。然而,TPL 附带了几个用于队列、集合、包等的线程安全类。
从它的声音来看,这是主/工作模式的变体,其中包含一些推测执行和工作窃取。您可以在http://parallelpatterns.codeplex.com/上找到有关此模式和其他模式的更多详细信息,有一个链接页面底部是 Stephen Toub 的白皮书,其中还包含其他详细信息。