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

5
我有一些用C#编写的类库,设计时没有考虑到并发、多线程、锁等因素... 代码结构非常良好,易于扩展,但是通过多线程可以获得很大的性能提升:这是一组科学/工程类库,需要在非常短的时间内执行数十亿次计算(现在它们没有利用可用的核心)。
我想将所有这些代码转换为一组多线程库,但是我不知道从哪里开始,也没有任何先前的经验。
我可以使用任何可用的帮助和任何建议/建议。
4个回答

9
我的建议是不要这样做。你没有编写该代码以用于并行处理,因此它不会起作用,并且会以难以调试的方式失败。
相反,我建议您提前决定哪部分代码可以从并行性中受益,然后从头开始重写该代码以实现并行性。您可以利用未修改的代码,并且还可以利用现有的自动化测试。
使用.NET 4.0 任务并行库 可能会使工作变得更容易,但它不会完全弥合不设计为并行处理和设计为并行处理的代码之间的差距。

约翰,你吓到我了!但是话说回来,你说得有道理。当我说代码结构良好时,我意味着某些部分、算法可能需要重新编写。 - ileon
1
@ipapasa:我的意思是吓唬你。我已经调试过这样的东西,也许你没有。这种东西会让你做噩梦。即使你从头开始设计,这些东西也很难。我曾经见过操作系统代码搞砸这个!恕我直言,但我不认为你能做得很好。 - John Saunders
1
@John:我很感激你的话,说实话,我会认真考虑它。 - ileon
@John:我认为这种想法非常短视。忽略并行性已经不再可接受 - 它应该成为每个专业程序员工具箱中的一项工具,大多数串行代码都有一些机会利用并行性而不会引起问题。一般来说,科学代码高度数据中心化,并且使用数据并行技术通常非常直观。我同意必须小心谨慎,但我认为应该这样做。 - Reed Copsey
@Reed:这可能适用于有并发问题经验的开发人员。但似乎不适用于OP。我强烈怀疑,如果他们尝试将这个现有的、熟悉的代码并行化,他们会被引入错过需要以不同方式完成的内容。相反,如果他们专注于学习如何创建高质量的并行算法,他们将能够利用现有代码的熟悉度,并将其应用到坚实的并行基础上。 - John Saunders
显示剩余3条评论

5

我强烈建议您深入了解.NET 4和任务并行库(也可通过Rx框架在.NET 3.5sp1中使用)。

它使许多并发问题变得更加简单,特别是数据并行化变得极为简单。由于大多数科学/工程库处理的是大型数据集,因此数据并行化通常是最佳选择...

关于数据并行性以及分解和解决问题的背景的参考资料,请查看我在.NET 4中的并行处理系列博客文章。


@Reed Copsey: “数据并行变得非常简单。” 你能具体说明一下吗?我感觉只有并行任务的执行变得更简单了...你是说数据并行变得更简单是因为可以针对集合中的每个项目执行并行任务,还是因为PLINQ或其他什么东西使竞争的减少变得更简单了? - Kiril
+1. 我还没有尝试过4个任务/线程的东西,但我听了一个播客,很多努力已经投入到使它更容易,无论是从工具/IDE的角度还是API抽象的角度。当我需要时,我期待着深入挖掘。@ipapasa,要注意Reed的建议基本上就是@John Saunders的建议。在移植之前先试玩一下。 - kenny
@Lirik:由于新的结构(如并行类)和许多聚合场景的自动处理(通过PLINQ或本地状态并行循环结构),以及许多新的支持并发数据类的引入,数据并行变得更加简单。 - Reed Copsey

2
如果您没有多线程的先前经验,我建议您首先通过查看各种资源了解基础知识:https://stackoverflow.com/questions/540242/book-or-resource-on-c-concurrency
使整个库成为多线程需要全新的架构方法。如果您只是在代码中随意加锁,那么您的代码会变得非常繁琐,并且您甚至可能无法获得任何性能提升。
最好的并发软件是无锁和无等待的……这在C#(.NET)中很难实现,因为大多数集合都不是无锁、无等待或甚至线程安全的。有关无锁数据结构的讨论。许多人已经引用了Boyet的文章(真的很好),有些人一直在谈论任务并行库作为.NET并发的下一个东西,但TPL实际上在线程安全集合方面并没有太多帮助。
.NET 4.0将推出Collections.Concurrent,这应该会有很大帮助。
不建议将整个库变为并发,因为它最初并没有考虑并发。您的下一个选择是浏览库并确定哪些部分实际上是多线程的好候选项,然后可以选择最佳并发解决方案并实现它。要记住的主要事情是,当您编写多线程代码时,并发应该导致程序的吞吐量增加。如果未实现增加的吞吐量(即您与顺序版本相匹配或吞吐量少于顺序版本),则在该代码中根本不应使用并发。

注意:所提到的问题已被删除。该问题推荐了Joe Duffy的书籍:Windows并发编程,这篇网页文章:C#中的线程,以及这本书:C#线程手册 - jrh

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接