C# 线程管理建议-TPL是一个好主意吗?

C# 线程管理建议-TPL是一个好主意吗?,c#,parallel-processing,heuristics,C#,Parallel Processing,Heuristics,我希望得到一些关于线程管理和任务并行库使用的建议,因为我不确定我是否走上了正确的道路。也许最好的办法是我给出一个我要做的事情的大纲 给定一个问题我需要使用基于启发式的算法生成一个解决方案。我首先计算一个基本解,我认为这个运算不能并行化,所以我们不需要担心 生成初始解决方案后,我想触发n线程,尝试找到更好的解决方案。这些线程需要做几件事: 它们需要使用不同的“优化度量”进行初始化。换句话说,他们试图优化不同的东西,在代码中设置优先级。这意味着它们运行的计算引擎略有不同。我不确定我是否能用第三方物流

我希望得到一些关于线程管理和任务并行库使用的建议,因为我不确定我是否走上了正确的道路。也许最好的办法是我给出一个我要做的事情的大纲

给定一个问题我需要使用基于启发式的算法生成一个解决方案。我首先计算一个基本解,我认为这个运算不能并行化,所以我们不需要担心

生成初始解决方案后,我想触发n线程,尝试找到更好的解决方案。这些线程需要做几件事:

  • 它们需要使用不同的“优化度量”进行初始化。换句话说,他们试图优化不同的东西,在代码中设置优先级。这意味着它们运行的计算引擎略有不同。我不确定我是否能用第三方物流做到这一点
  • 如果其中一个线程找到比当前最知名的解决方案更好的解决方案(需要在所有线程之间共享),那么它需要更新最佳解决方案,并强制许多其他线程重新启动(这同样取决于优化指标的优先级)
  • 我还可能希望跨线程合并某些计算(例如,为问题的特定方法保持概率的并集)。不过,这可能更具选择性
  • 整个系统显然需要线程安全,我希望它能尽快运行
  • 我尝试了相当多的实现,包括管理我自己的线程和关闭它们等等,但它开始变得相当复杂,我现在想知道TPL是否会更好。我想知道是否有人能提供一般指导


    谢谢……

    不管你怎么做,这都会很复杂。编写正确的同步代码非常困难。我认为TPL在这方面做得太过火了

    我的建议是坐下来看看这个问题,然后用白板把它解决掉,并尽可能地消除复杂性

    也许这会有帮助。。。创建一个优化指标队列和一个具有最佳答案的共享类。用读写器锁保护共享类,用互斥锁或其他锁保护队列。启动4-8个线程(每个CPU一个线程,如果阻塞过多,可以多个),并让它们在循环中运行。从队列中删除一个项目,对其进行处理,检查共享数据,重复操作,直到没有更多项目

    抵制启动3000个线程的诱惑,并小心竞争条件,比如:拉共享类上的读卡器锁,检查您的答案——假设这是一个更好的答案,拉读卡器锁,拉写器锁并更新共享类。这里的问题是,当您在等待writer锁时,另一个线程可能已经更新了类,而您在获得writer锁后,没有检查就将“最佳”答案吹走了


    玩得开心。

    我肯定会看看TPL。它允许你抽象你的问题。您可以考虑任务及其工作方式并共享数据,而不是在底层线程模型上花费同样多的时间,创建并管理wn线程。TPL将允许您创建它分配给线程池的任务。然后,TPL管理池,并将调整正在运行的任务的数量,以最大限度地提高性能。它将在各种硬件配置(核心)上实现这一点,这使得开发和应用程序更加容易,在不同硬件之间移动时不需要进行重大重写

    还有很多事情需要考虑,尤其是关于共享状态。TPL通常是一种比您自己滚动更好的方法,除非您非常熟悉线程和/或有一些TPL不适合的特殊情况应用

    1.需要使用不同的“优化指标”对其进行初始化。在里面 换句话说,他们正试图 使用 代码中设置的优先级。这 意味着它们的运行方式略有不同 计算引擎。我不确定我是否 我可以用第三方物流做到这一点

    您可以通过创建任务并向其传递不同的启动条件来实现这一点

    2.如果其中一个线程找到了一个更好的解决方案,该解决方案目前最为人所知 解决方案(需要共享) 然后它需要 更新最佳解决方案,并强制 要重新启动的其他线程数 (这同样取决于优先级 优化指标的级别)

    可以取消任务并启动新任务

    3.我还可能希望跨线程合并某些计算(例如保持 某一特定事件的概率并集 解决问题的方法)。这是 不过可能更多的选择

    我不确定我是否理解这个要求

    4.整个系统显然需要线程安全,我希望它是 尽可能快地跑

    即使使用TPL,您也可以跨任务(线程)共享数据,这仍然是您以线程安全的方式完成这项工作的责任。但是,TPL附带了几个线程安全类,用于队列、收集、包等


    从它的声音来看,这是主/工作者模式的一个变体,加入了一些推测性的执行和工作窃取。您可以在页面底部找到有关此模式和其他模式的更多详细信息,该页面还提供了斯蒂芬·图布(Stephen Toub)白皮书的链接,该白皮书还介绍了其他详细信息。

    嗨,卡尔,感谢您的回复。我喜欢TPL的一个特点是,它可以随着CPU和系统中发生的事情自动扩展。使我不必监视线程性能等,并相应地调整线程数。我以前已经设法解决了很多问题,只是其中一个问题,很难把所有问题都记在脑子里