将.NET类库转换为多线程.NET类库的最佳实践

时间:2010-03-10 02:04:02

标签: c# .net multithreading class-library

我有一些C#类库,它们的设计没有考虑并发,多线程,锁等等......

代码结构非常好,易于扩展,但它可以从多线程中受益匪浅:它是一组科学/工程库,需要在非常短的时间内执行数十亿次计算(现在他们不会从可用的核心中获益。

我想将所有这些代码转换为一组多线程库,但我不知道从哪里开始,而且我之前没有任何经验。

我可以使用任何可用的帮助,以及任何建议/建议。

4 个答案:

答案 0 :(得分:9)

我的建议是不要这样做。您没有编写要并行使用的代码,因此它不会起作用,并且会以难以调试的方式失败。

相反,我建议您提前决定该代码的哪一部分可以从并行性中受益最多,然后从头开始重写该代码并行。您可以利用在您面前的未修改代码,也可以利用现有的自动化测试。

使用.NET 4.0 Task Parallel Library可能会使工作变得更容易,但它不会完全弥合未设计为并行的代码与代码之间的差距。

答案 1 :(得分:5)

我强烈建议您查看.NET 4和Task Parallel Library(也可以通过Rx框架在.NET 3.5sp1中使用)。

它使许多并发问题变得非常简单,特别是数据并行性变得非常简单。由于您在大多数科学/工程库中处理大型数据集,因此数据并行性通常是可行的方法......

对于某些参考资料,尤其是有关数据并行性和有关分解和解决问题的背景资料,您可能需要阅读Parallelism in .NET 4上的博客系列。

答案 2 :(得分:2)

如果您之前没有任何多线程经验,那么我建议您先查看各种资源,先了解基础知识:https://stackoverflow.com/questions/540242/book-or-resource-on-c-concurrency

使整个库成为多线程需要一种全新的架构方法。如果您只是四处走动并开始在代码中的任何位置放置锁定,那么最终会使代码变得非常麻烦,甚至可能无法实现性能提升。

最好的并发软件是无锁且无需等待的......这在C#(.NET)中很难实现,因为大多数集合都不是无锁,无等待甚至是线程安全的。有关lock-free data structures的各种讨论。很多人都有referenced Boyet's articles(这真的很棒),有些人一直在使用任务并行库作为.NET并发中的下一个东西,但是TPL在线程方面确实没有给你太多 - 安全的收藏。

.NET 4.0随Collections.Concurrent推出,应该会有很多帮助。

不推荐使您的整个库并发,因为它从一开始就没有考虑到并发性。您的下一个选择是通过您的库并确定它的哪些部分实际上是多线程的合适候选者,然后您可以为它们选择最佳的并发解决方案并实现它。要记住的主要事情是,当您编写多线程代码时,并发性应该会提高程序的吞吐量。如果没有达到增加的吞吐量(即你匹配或吞吐量小于顺序版本),那么你就不应该在该代码中使用并发。

答案 3 :(得分:0)

最佳起点可能是http://msdn.microsoft.com/en-us/concurrency/default.aspx

祝你好运!