基本信息
- 原书名:The Art of Concurrency: A Thread Monkey's Guide to Writing Parallel Applications
- 原出版社: O'Reilly Media

【插图】

编辑推荐
Intel资深工程师分享并发编程知识及内幕技术
详述如何在各种算法中使用线程化方法
开发并行代码算法程序员必备手册
内容简介
计算机书籍
如果你希望通过并发编程来充分发挥多核处理器的强大功能,那么本书将为你提供所需的理论知识和实际经验。本书是为数不多的几本介绍如何在多核处理器的共享内存模型中实现算法的书籍之一,它并非仅仅介绍一些理论模型或者分布式内存架构。本书详细分析了各种示例程序,这些内容非常有助于你将串行代码转换为并行代码,此外还介绍了如何避免一些常见的错误。<BR>本书的作者是Intel公司的一位资深工程师,他从事并发编程已经有20多年的时间,本书将帮助您:分析在共享内存模型与分布式内存模型之间的编程差异。学习如何设计多线程程序,包括对程序的测试和调优。了解如何最有效地使用各种不同的线程化机制,包括Windows线程、POSIX线程、OpenMP以及Intel Threading Building Blocks。掌握如何实现各种并发算法,包括排序、搜索、图以及其他一些实用的计算。<BR>本书还介绍了如何在算法中实现高可伸缩性,使得算法能够充分发挥将来包含更多核处理器的强大功能。对于开发并行代码算法的程序员来说,本书是必不可少的。
作译者
目录
前言
多核处理器在问世之初就展示出了强大的威力。由于发热量以及能耗的增加,处理器的时钟频率无法再像过去三十年那样每18个月翻一番。为了保证下一代处理器运算能力的持续增加,处理器生产商们开始在芯片内部设计多个处理器核。虽然多核处理器的运行速度有所降低,但与时钟频率翻番的单核处理器核相比,它们产生的热量更少,并且能耗也更低。
然而,如何来充分发挥多核的强大运算能力?我们可以每次运行多个程序,并且为每个程序专门分配一个处理器核来运行。这就实现了真正意义上的并行执行。然而,在这种情况下能够同时运行的程序数量也只能是等于处理器核的数量。如果这些程序并非是计算密集型的程序,那么可能会浪费计算周期。
另一种方式是,在编写程序时,将需要执行大量计算并且在计算之间彼此独立的代码放在另外的处理器核上执行。编写这种程序的过程就被称之为并发编程。与任何一种编程语言或者方法一样,在设计和实现并发程序中同样存在着许多技术,窍门,误区以及工具。我始终觉得这种编程还是一种“艺术”,留有足够大的自由发挥空间,而并非像一门“科学”那样有着严格的步骤可供遵循。因此,本书将介绍并发编程中的一些基础知识和少量的“内幕技术”。
在过去,并行编程只是少数程序员的专有技术,他们的研究领域通常与科学计算等方面相关。然而,从现在开始,并发编程正在逐步成为一种主流技术。并行编程最终将编程“编程”的同义词。现在,你要着手开始学习并行编程,或者至少要跟上并发编程的发展趋势。
本书的目标读者
本书适合于各种程序员阅读。
在我工作的计算机公司中,团队里只有我一个人拥有计算机科学学位。当我提到想通过一个确定型下推自动机(Deterministic Pushdown Automata)来解析LR(1)语法时,在办公室里也只有另一个人能明白我的意思。因此,计算机专业的学生只是本书目标读者的一部分。 在本书中,我尽可能地少使用计算机专业的特定知识。我假设本书的读者已经在数据结构,算法,以及算法复杂度等方面具备了一定的基础知识,这些知识通常会在计算机科学专业的本科课程中教授。对于我所介绍的其他内容,我都会尽力给出足够详细的解释来使读者了解其中的思想。如果你有着一年以上的编码经验,那么理解起来就不成问题。
我用C语言编写了所有的代码。这并不意味着不尊重其他语言,而是我发现C语言是支持线程并且得到最多认同的编程语言之一。其他语言,例如Java和C#等,同样支持线程,但如果我在书中用这些语言来编写代码,而你又没有使用过这些语言,那么就不会阅读本书。我认为,大多数能够编写并发程序的程序员至少都能够“读懂”C代码。理解在代码中使用的各种并发方法要比用某种特定语言来编写代码的能力更为重要。你同样可以在C#或者Java中实现这些思想。
我假设你至少已经读过了一本介绍多线程编程的书。在市面上已经有许多这类的书,因此我不会在本书中详细介绍多线程编程的各种机制(因为这些内容至少要占到1到2本书的篇幅)。在本书中我同样不会只使用一种编程模式,因为许多编程模式的功能在很大程度上都是重叠的。在本书的后半部分,我将给出如何在各种算法中使用线程化方法。在一些情况中,如果某种方法与其他方法在使用上存在较大的差异,那么在书中将指出这些差异。
对于在本书中使用的各种线程化编程方法,我都给出了简要的回顾,这样你能够重新回想起它们,或者了解那些还没有使用过的方法。但我的本意并非是说你需要知道所有编写多线程程序的方式。只要了解其中一种就足够了。不过,如果你换了一份工作或者发现你所掌握的多线程编程方法不能很好地解决你所遇到的问题,那么了解其他的多线程编程方就是有用的——这将帮助你很快地学习和使用某种新方法。
本书的内容
第1章,“想不想让程序运行得更快?想的话就举手!”,介绍了一些在并发编程中常见的问题以及相应的答案。本章介绍了“并行(Parallel)”与“并发(Concurrent)”这两个术语的区别,并给出了线程化方法中的四个步骤。在本章的结尾介绍了关于并发编程的一些背景知识,以及在分布式内存模型和共享内存模型之间的一些差异和相似性。
第2章,“是否采用并发?”,介绍了如何根据串行算法来设计并发算法。本章详细阐述了两种并发设计模型——任务分解与数据分解。本章还给出了一些无法并行化的串行代码示例。在一些可以并行化的示例中,我给出了相应的提示和技巧来将串行代码修改为更易于并行化的形式。
第3章,“算法正确性证明与性能衡量”,首先介绍了如何证明在并发算法中不包含一些常见的线程化错误,并且指出了你所可能遇到的问题(这样就可以修复这些问题)。在本章的第2部分介绍了如何判断并发代码相对于最初串行代码的性能提升程度。在本章的结尾处简单回顾了硬件从过去一直到当前多核处理器的发展历程,因为我觉得似乎只有在这个地方才合适介绍这些内容。
第4章,“多线程程序设计中的八条简单规则”,介绍的内容在本章标题中已经说得很清楚了。在本中的许多地方都将提到这些简单的规则。
第5章,“线程化库”,介绍了OpenMP,Intel Threading Building Block,POSIX线程以及Windows线程库等。在本章的结尾处还介绍了在一些特定领域使用的库。
第6章,“并行求和与前缀求和”,详细介绍了两种并发算法。本章同样还介绍了并发选择算法,并且在实现并发选择算法时分别使用了并行求和与前缀求和。
第7章,“映射归约”,介绍了映射归约算法框架;如何实现一个完全并发的归约运算;并且在本章的末尾介绍了如何通过映射归约算法框架来找出互为友好的数值。
第8章,“排序”,介绍了并发的冒泡排序,奇偶排序,希尔排序,快速排序,以及两种基数排序。
媒体评论
——Tom Murphy,Contra Costa大学,计算机科学委员会主席
终于出现了一本专门介绍并发性的书。书中介绍了大量实用的重要算法,并且采用多种方式对算法进行分析,重点讲解了如何通过各种并行编程技术来提升程序的性能。
——Mike Pearce,Intel Software Network网站,并行计算负责人