我有一些 C# 类库,它们的设计没有考虑并发、多线程、锁等。
代码结构非常好,易于扩展,但它可以从多线程中受益匪浅:它是一组需要在非常短的时间内执行数十亿次计算的科学/工程库(现在它们没有受益从可用的核心)。
我想将所有这些代码转换为一组多线程库,但我不知道从哪里开始,而且我之前没有任何经验。
我可以使用任何可用的帮助以及任何建议/建议。
我有一些 C# 类库,它们的设计没有考虑并发、多线程、锁等。
代码结构非常好,易于扩展,但它可以从多线程中受益匪浅:它是一组需要在非常短的时间内执行数十亿次计算的科学/工程库(现在它们没有受益从可用的核心)。
我想将所有这些代码转换为一组多线程库,但我不知道从哪里开始,而且我之前没有任何经验。
我可以使用任何可用的帮助以及任何建议/建议。
我的建议是不要这样做。您没有编写要并行使用的代码,因此它不会工作,并且会以难以调试的方式失败。
相反,我建议您提前决定代码的哪一部分可以从并行性中获益最多,然后从头开始重写该代码,使其具有并行性。您可以利用面前未修改的代码,也可以利用现有的自动化测试。
使用 .NET 4.0任务并行库可能会使工作变得更容易,但它不会完全弥合非并行代码与并行代码之间的差距。
我强烈建议您研究 .NET 4 和Task Parallel Library(也可以通过 Rx Framework 在 .NET 3.5sp1 中获得)。
它使许多并发问题变得非常简单,特别是数据并行性变得非常简单。由于您在大多数科学/工程库中处理大型数据集,因此数据并行性通常是要走的路……
对于一些参考资料,特别是关于数据并行性和关于分解和解决问题的背景,您可能需要阅读我关于.NET 4 中的并行性的博客系列。
如果您以前没有任何多线程经验,那么我建议您首先通过查看各种资源来了解基础知识:https ://stackoverflow.com/questions/540242/book-or-resource-on-c-并发
使您的整个库多线程化需要一种全新的架构方法。如果您只是四处走动并开始在代码中到处加锁,您最终会使您的代码非常繁琐,甚至可能无法实现任何性能提升。
最好的并发软件是无锁和无等待的......这在 C# (.NET) 中很难实现,因为您的大多数集合都不是无锁、无等待甚至线程安全的。关于无锁数据结构有各种讨论。很多人都参考了 Boyet 的文章(真的很好),有些人一直在抛出任务并行库作为 .NET 并发中的下一个东西,但是 TPL 在线程安全集合方面确实没有给你太多.
.NET 4.0 与Collections.Concurrent一起出现,这应该会有很大帮助。
不建议使您的整个库并发,因为它从一开始就没有考虑到并发性。您的下一个选择是浏览您的库并确定其中的哪些部分实际上是多线程的良好候选者,然后您可以为它们选择最佳的并发解决方案并实施它。要记住的主要事情是,当您编写多线程代码时,并发性应该会增加程序的吞吐量。如果没有实现增加的吞吐量(即您匹配或吞吐量低于顺序版本),那么您不应该在该代码中使用并发。
最好的起点可能是http://msdn.microsoft.com/en-us/concurrency/default.aspx
祝你好运!