Fork me on GitHub
理解并发编程中的几种并发方式

理解并发编程中的几种并发方式

 

时刻谨记并发设计

当你设计代码利用多核优势的时候,重要的是不要老是想着C#程序代码是独自执行的。C#为并发代码做了设计,也就是很多代码可以在同一个进程里同时执行或者交错执行。相同的类方法可以在并行代码里执行。如果这个方法在静态变量里保存了状态,以后再使用这个状态,这样的并行执行会产生非期望的和不可预料的结果。

就像前边解释的,多核微处理器上的并行编程使用的是共享内存模型。如果没有考虑并发,那些在相同的共享内存里的数据可能会导致不可预料的结果。

使每个类和方法可以没有副作用的并行执行是一个好的实践。如果你考虑不能讲某些类、方法、组件不能设计成并发的,在设计并行代码前需要对设计进行测试。

设计过程中探测到的每个子问题都应该有能力在其他子问题执行的时候并行执行。当你认为有必要限制某个使用遗留类、方法、组件的子问题的并发代码的时候,你需要在设计文档里记载清楚。一旦开始使用并发代码工作,极易发生不能与已存的类、方法、组件协作,因为他们没有做并发执行的设计。

理解交错并发、并发和并行的不同

当有两个软件线程都执行四个指令时,图1-15展示了交错并行和并行的不同。交错并发执行的场景交错的执行每个线程上的指令,但是并发执行的场景同时执行两条指令。代码设计必须同时考虑到这两种场景。

并行(Parallelized)代码可以在很多的不同的并发和交错并发的场景中执行,甚至是在相同的硬件配置中执行。所以,并行设计的一个很大的挑战就是确保其执行顺序的有效性和结果的正确性,否则就会长生不正确的结果。如果你需要以一种特殊的顺序或者代码的某些部分不能够同时执行,那么就有必要确保这些部分代码不能并行执行。你不能假设他们不能并发执行,因为你执行它很多次,它会产生希望的结果。当你为并发和并行而设计是,你必须确保你的思考的正确性。

在下一章中,你将会通过不同种类的代码示例,学到更多有关并行和并发的不同点。

 

 1-15

并行的任务

Visual C# 2010.NET 4.0使我们将基于任务的设计转变成并行的代码变得容易。然而,为了完成预期的目的,理解并行代码需要的特殊的测试和协调的步骤是很重要的。你将通过本书余下的部分学习相关的知识。

当你并行化任务的时候,由其导致的首要的冲击可能就是需要测试不同的选择。就像前边解释的一样,现在的多核微处理器是异常的复杂,有必要测试不同并行技术的结果直到你可以做出选择。事实上,顺序代码执行结果相同,但是就像你已经知道的foreachfor循环慢,但是并行执行的时候会不同。当并行化任务的时候,一个并行版本的for循环会根据不同的参数决定并行执行任务的方式,从而提供了不同的性能结果。一旦你经历了这些场景,当你编写代码解决类似问题或者进行类似的任务设计的时候,就会考虑到这些情况。

有必要连接多个任务,代码被分解成多个任务,并行执行操作,收集结果,然后像这样往复循环。在决定并行执行对某个问题不是好的选择之前,尽量创建一个好像有1000个内核并行执行的图表。如果一个算法的某些并行执行部分没有提供期望的伸缩性,你还有机会与其他任务并行的执行它。

 
分类: 翻译
posted on 2012-06-13 09:19  HackerVirus  阅读(247)  评论(0编辑  收藏  举报