首页>参考读物>计算机科学与技术>综合

Windows并发编程指南
作者 : (美)Joe Duffy 著
译者 : 聂雪军 等译
出版日期 : 2009-12-18
ISBN : 978-7-111-28820-6
定价 : 89.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 618
开本 : 16
原书名 : Concurrent Programming On Windows, 1E
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书详细讲述Windows并发编程的相关知识。内容分为四个部分:第一部分“概念”从高层视角介绍并发的基本概念;第二部分“机制”重点介绍了一些基础的功能、内部工作机制以及各种API等;第三部分“技术”介绍了一些常见的编程模式、最优方法、算法,以及在编写并发软件时需要使用的各种数据结构;第四部分“系统”介绍了一些在系统架构和流程中经常出现的问题。这四个部分形成了一个严密的逻辑体系:概念”部分将为读者理解并发打下基础;如果没有透彻地理解“机制”部分的内容,那么在理解“技术”部分的内容时将遇到困难;同样,如果没有很好地理解其他部分,那么要构建实际的“系统”也是不现实的。本书的末尾还包括两个附录。

图书特色

Windows并发编程指南
(美)Joe Duffy 著
聂雪军 等译
深入揭示Windows并发编程理论及实现
微软首席研究与战略官Craig Mundie作序推荐

“在程序中使用多线程时,简单明了的架构和设计是非常重要的……这要求我们不仅要全面地理解平台的各项功能,而且还要随时关注一些新近出现的最优方法。Joe在本书中完美地阐述了并发的基本理论以及各种最优方法。”
—— Craig Mundie,微软公司首席研究与战略官

本书详尽地介绍了如何在开发软件时高效地使用并发和硬件并行,以及如何设计、实现和维护大型的、主要以Windows平台上的C#和C++等语言编写的并发程序。
本书为应用程序、系统以及库等的开发人员在多核处理器上编写高效、安全的代码提供必要的工具和技术指导。这不仅对于那些存在内在并发性的领域(如服务器应用、计算密集的图像处理、金融分析、数值模拟以及AI算法等)来说是很重要的,而且对于一些可以通过并行来获得加速的领域(如数学库、排序算法、报告生成、XML处理以及流式处理算法等)来说同样是重要的。
本书主要包括四部分:第一部分从高层视角介绍并发的一些基本概念;第二部分重点介绍一些重要的平台功能、内部工作机制以及API细节等;第三部分介绍在编写并发软件时一些常见的编程模式、最优方法、算法和数据结构等;第四部分介绍在编写并发程序时需要注意的一些系统性的架构和流程方面的问题。
要想学习在Windows和.NET上进行并发编程的最优方法和通用模式,那么本书将是你唯一需要的一本书。

作者简介
Joe Duffy 是微软公司.NET框架团队中负责并行扩展库(Parallel Extensions)的开发主管、架构师和奠基人。除了编写代码和管理开发团队之外,他还致力于一些长期性和前瞻性的工作,例如支持并发安全性的语言和类型系统。他曾在通用语言运行时(Common Language Runtime)团队中工作过。Joe的博客地址是www.bluebytesoftware.com/blog。

图书前言

我在2005年底开始写这本书。当时,双核处理器正成为普通消费者(非程序员)购买PC的主流标准,并且在计算机业界也开始有人在讨论日渐重要的并发问题(例如,Herb Sutter发表的经典文章“The Free Lunch is Over”)。当然,人们担心的问题是,过去在编写软件时并没有考虑如何充分利用不断增加的计算能力,因为时钟频率似乎会永无止境地增加下去。 然而,没有更多的免费午餐了,确实如此。
  在我看来,并发正在成为每个软件开发人员工作中的重要组成部分,而与本书类似的其他介绍并发的书籍也将变得更为重要和有用。仅仅2年后,这种影响开始从操作系统通过各种库延伸到了应用程序本身。
  当时,我刚好完成了一个历时6个月的小型项目原型,叫做“并行的语言级集成查询”(Parallel Language Integrated Query,PLINQ), 我在PLINQ项目中深入分析了并发的复杂性以及如何在实际中使用并行。我将PLINQ作为一种工具用于找出Windows在并发方面的不足之处。这是我日常工作之外的研究,我在Microsoft的主要工作是研究“软件事务内存”(Software Transactional Memory,STM),这项技术已经成为业界的一个流行术语。无需多言,我在并发问题上已经投入了大量的研究工作。那么,能否通过编写一本介绍并发的书来使研究工作更进一步?
  随着我在这些项目上不断工作,以及最终将PLINQ发展为.NET框架的并行扩展(Parallel Extension),令我感到吃惊的是,介绍Windows并发的书籍少之又少。我还记得自己一次又一次地对一些复杂且神秘的并发信息感到困惑,然后匆匆记录下来并把它们包含在本书中。我当时多么希望有人曾经在我之前记录了这些信息,这样我就不需要为收集它们费那么多周折: 例如,在走廊上和同事一起讨论,在夜晚琢磨Windows和CLR的源代码,以及反复阅读Microsoft员工撰写的博客。关于并发主题的最好书籍还要追溯到20世纪90年代早期,而且,尽管这些书中的内容仍然是有价值的,但却过分关注于各种并发机制,而对于如何设计并行程序结构,实现并行算法,应对并发带来的各种危害,以及介绍一些重要概念则显得有所不足。其他的一些文献则是以学术界和理论研究人员为目标,而不是以开发应用程序、系统和库的工程师们为目标。
  于是,我决定以自己喜欢的方式来写一本书,采用一种有用的方式来描述我所收集的各种信息。虽然这本书花了我长达两年半的时间才完成,但由于在并发编程方面的技术发展较慢,因此本书介绍的各个主题仍然是非常适用的。我希望本书不仅实用,而且还能包含更多深入的技术信息。对于任何Windows或者.NET开发人员,如果他们相信并发将成为所有软件的一个重要需求,那么都会发现本书是非常有用的。
  我从写作本书中获得了许多乐趣,并且我希望各位读者也同样在阅读中获得乐趣。
本书的结构
  我将本书内容分为四个主要的部分。第一部分“概念”,从高层视角来介绍并发,对于每个主题并没有进行深入的分析。第二部分“机制”,重点介绍了一些基础的功能、内部工作机制以及各种API等。第三部分“技术”,介绍了一些常见的编程模式、最优方法、算法,以及在编写并发软件时需要使用的各种数据结构。第四部分“系统”,介绍了一些在系统架构和流程中经常出现的问题。这4个部分形成了一个系列。最开始是“概念”部分,这部分内容将为读者理解并发打下一个基础。如果没有透彻地理解“机制”部分的内容,那么在理解“技术”部分的内容时将遇到困难,同样,如果没有很好地理解其他部分,那么要构建实际的“系统”也是不现实的。本书的末尾还包括了两个附录。
代码要求
  要运行本书中的代码,需要下载一些免费软件:
   Microsoft Windows SDK。这包括Microsoft C++编译器以及相关的头文件和库。在编写本书时,最新的版本是Windows Vista和Server 2008 SDK。
   Microsoft .NET框架SDK。这包括Microsoft C#和Visual Basic编译器,以及相关的框架库。在编写本书时,最新的版本是.NET框架3.5 SDK。
  二者都可以在MSDN中找到,网址是http://msdn.microsoft.com。
  此外,我还强烈建议你使用Visual Studio。虽然并非一定需要使用它(事实上,本书的大部分代码都是在emacs中编写的),但Visual Studio提供了更完备的开发环境和调试环境。 可以免费下载Visual Studio 2008精简版,不过它缺少了许多有用的功能,例如性能分析。
  最后,还可以使用Windows调试工具集(Debugging Tools for Windows),尤其是在没有Visual Studio的情况下,这个软件包包含了调试工具WINDBG,可以从http://www.microsoft.com免费下载。同样,还可以从http://technet.microsoft.com/sysinternals下载Sysinternals工具,这个工具在分析Windows操作系统时将非常有用。
  本书还有一个专门的网站:
  http://www.bluebytesoftware.com/books

Joe Duffy
2008年6年
joe@bluebytesoftware.com
http://www.bluebytesoftware.com

封底文字

“当你在程序中使用多线程时,一个简单明了的架构和设计是非常重要的……这要求我们不仅要全面地理解平台的各项功能,而且还要随时关注一些新近出现的最优方法。Joe在《Windows并发编程指南》中完美地阐述了并发的基本理论以及各种最优方法。”
——Craig Mundie,首席研究与战略官,就职于Microsoft公司
  作者Joe Duffy详尽地介绍了如何在开发软件时高效地使用并发以及硬件并行。在《Windows并发编程指南》中,他介绍了如何设计、实现以及维护大型的并发程序,其中示例程序主要是以Windows平台上的C#和C++等语言编写的。
  Duffy的目的在于,为开发应用程序、系统以及库等的人员在多核处理器上编写高效、安全的代码提供必要的工具和技术指导。这不仅对于那些存在内在并发性的领域(例如服务器程序、计算密集的图像处理程序、金融分析、数值模拟以及AI算法等)来说是很重要的,而且对于一些可以通过并行来获得加速的领域(例如数学库、排序算法、报告生成软件、XML处理软件以及流式处理算法等)来说同样是重要的。
  本书主要包括四个部分:第一部分从高层视角介绍了并发的一些基本概念;第二部分重点介绍了一些重要的平台功能、内部工作机制以及API等;第三部分介绍了在编写并发软件时一些常见的编程模式、最优方法、算法和数据结构等;第四部分介绍了在编写并发程序时需要注意的一些架构性和流程方面的问题。
  要想学习在Windows和.NET上进行并发编程的最优方法和通用模式,那么本书将是你唯一需要的一本书。

Microsoft .NET开发系列丛书
“本丛书得到了Microsoft公司中多位负责核心技术的开发主管和首席开发人员的大力支持,丛书的作者包括Microsoft的一些资深架构师和开发人员以及整个开发人员群体。”
——Don Box,架构师,就职于Microsoft
“本丛书为专业.NET开发人员提供了丰富的参考资源。它覆盖了所有的知识面,包括专家观点以及常规参考信息等。对于那些希望扩充知识领域的开发人员来说,尤其需要阅读本丛书系列。”
——John Montgomery,程序经理,就职于Microsoft开发部
“这是介绍.NET技术的最重要丛书,它包含了关于.NET框架的许多重要信息,开发人员可以通过这些信息来充分发掘.NET框架的功能。丛书的作者都是某项核心技术的创建者或者主要参与人员。”
——Brad Abrams,程序经理,就职于Microsoft

作者简介

(美)Joe Duffy 著:Joe Duffy是Microsoft公司.NET框架团队中负责并行扩展库(Parallel Extensions)的开发主管、架构师和奠基人。除了编写代码和管理开发团队之外,他还致力于一些长期性和前瞻性的工作,例如支持并发安全性的语言和类型。他之前曾在通用语言运行时(Common Language Runtime)团队中工作过。Joe的博客地址是www.bluebytesoftware.com/blog。

译者简介

聂雪军 等译:暂无简介

译者序

随着多核处理器的日益普及,并发也逐渐成为IT行业和广大开发人员的关注焦点。并发并非一项新技术,例如在高端服务器和大型机上的并发技术已经发展了数十年,而在研究领域关于并发的理论也非常成熟。然而,要将并发作为一种普及性的编程技术,却还有很长的路要走。正如“罗马不是一日建成的”,开发人员在从传统的串行编程转向并行编程时也不能一蹴而就。这种转变要求从程序的设计、架构、开发、调试以及测试等方面都作出重大的调整,这种调整的规模或许不亚于从结构化编程转向面向对象编程的过程。
  在这种转变过程中,开发人员会遇到许多问题:例如如何选择正确的同步原语,如何在程序的不同部分之间实现协同,哪些数据结构和设计模式可以提高并发编程的效率,以及如何避免并发中的一些常见错误等。在面对这些问题时,开发人员需要一本全面且实用的参考书,它不仅能由浅入深地阐述并发的各种基本概念,而且还能提供丰富的应用示例,Duffy的这本书正好能满足所有这些需求。本书包含以下特点:
  (1)全面性。作者首先从高层视角阐述了Windows了并发机制的总体概览,然后从系统内核的底层同步原语(例如线程、内核同步原语等)开始,一直介绍到.NET中的高层同步抽象(例如线程池、数据同步与控制同步),基本上涵盖了Windows上各个层次的并发概念和机制。本书还介绍了一些与并发紧密相关的高级主题,包括内存模型与无锁编程、纤程、图形用户界面、输入与输出等。最后,本书还介绍了在并发编程中常见的误区与陷阱、编写可重用并发库时需要遵循的一些指导原则,以及如何衡量并发为程序带来的性能提升。
  (2)实用性。在了解了Windows上的各种并发机制后,更重要的是如何在编程中使用它们,包括如何根据具体的问题来选择编程模式、最优方法以及数据结构等。针对这些需求,本书介绍了异步编程模型、并行容器,以及更高级的数据并行和任务并行等编程模式,这些内容足以处理各种常见的并发编程情况。此外,书中还给出了丰富的示例程序和代码分析。
  在本书每一章的“延伸阅读”中还给出许多参考文献,包括公开发表的文章、参考书籍、研究报告以及博客等,希望进一步了解相关内容的读者可以阅读这些文献。
  对于大多数程序员来说,并发仍然是一项神秘的技术,然而它也是我们在将来工作中不可回避的一个问题。“与其临渊羡鱼,不如退而结网”,虽然并发是一项较难掌握的技术,但只要按本书的内容组织循序渐进地学习,就一定可以将并发技术应用自如。
由于本书的技术性较强,因此读者在阅读本书时需要预先具备一定的基础,包括熟悉C++和C#等语言,对.NET框架和Windows系统的底层架构有一定的了解,并具备一定的编程和调试基础。
  参与本书翻译工作的还有李杨、吴汉平、徐光景、童胜汉、陈军、胡凯、刘红、张玮、陈红、李斌、李勇涛、王海涛、周云波、彭敏才、张世锋、朱介秋、宗敬、李静、叶锦、高波、熊莉、程凤、陈娟、胡世娟、董敏、谢路阳、冯卓、李志勇、胡欢、王进等。由于译者的时间和水平有限,翻译中的疏漏和错误在所难免,还望读者和同行不吝指正。
  感谢冀康将这本书的翻译工作交给了我,让我再次体会到翻译一本好书带来的乐趣。感谢家人在翻译本书的过程中给予的理解和支持,使我能够顺利完成翻译工作。

  聂雪军
2009年8月于武汉

图书目录

对本书的赞誉
译者序

前言
致谢
作者简介
第一部分 概  念
第 1 章 概述1
1.1 为什么需要并发1
1.2 程序架构与并发2
1.3 并行的层次4
1.4 为什么不需要并发5
1.5 小结5
延伸阅读6
第 2 章 同步与时间7
2.1 程序状态的管理7
2.1.1 共享状态与私有状态的区分8
2.1.2 状态机与时间11
2.1.3 独立性17
2.1.4 不变性19
2.2 同步:种类与实现技术22
2.2.1 数据同步23
2.2.2 协作与控制同步35
2.3 小结43
延伸阅读43
第二部分 机  制
第 3 章 线程45
3.1 从高层面上来看线程45
3.1.1 Windows线程是什么46
3.1.2 CLR线程是什么48
3.1.3 显式线程操作及其替代方法49
3.2 线程的诞生与消亡50
3.2.1 线程的创建50
3.2.2 线程终止59
3.2.3 DllMain66
3.2.4 线程局部存储68
3.3 小结72
延伸阅读73
第 4 章 线程的高级内容74
4.1 线程的状态74
4.1.1 用户态线程栈74
4.1.2 内部数据结构(KTHREAD、ETHREAD和TEB)85
4.1.3 上下文89
4.2 线程的创建过程与终止过程90
4.2.1 线程创建的具体流程90
4.2.2 线程终止的具体流程91
4.3 线程调度91
4.3.1 线程的状态92
4.3.2 优先级94
4.3.3 时间片96
4.3.4 优先级与时间片调整97
4.3.5 睡眠与退让99
4.3.6 挂起100
4.3.7 关联性:优先在某个CPU上运行101
4.4 小结107
延伸阅读107
第 5 章 Windows内核同步机制108
5.1 基础知识:触发和等待108
5.1.1 为什么要使用内核对象110
5.1.2 在非托管代码中执行等待操作111
5.1.3 托管代码122
5.1.4 异步过程调用124
5.2 内核对象的使用126
5.2.1 互斥体126
5.2.2 信号量131
5.2.3 互斥体/信号量使用示例:阻塞/有界的队列134
5.2.4 自动重置事件和手动重置事件136
5.2.5 等待定时器141
  5.2.6 触发对象与自动等待146
5.2.7 内核对象的调试152
5.3 小结153
延伸阅读154
第 6 章 数据同步与控制同步155
6.1 互斥156
6.1.1 Win32临界区156
6.1.2 CLR锁166
6.2 读/写锁(RWL)177
6.2.1 Windows Vista中的轻量级读/写锁178
6.2.2 .NET框架中的轻量级读/写锁(3.5)181
6.2.3 .NET框架中原来的读/写锁185
6.3 条件变量187
6.3.1 Windows Vista条件变量187
6.3.2 .NET框架的Monitor191
6.3.3 被守护区域192
6.4 小结193
延伸阅读193
第 7 章 线程池195
7.1 线程池的基本知识195
7.1.1 三种方式:Windows Vista、Windows遗留代码以及CLR196
7.1.2 通用功能197
7.2 Windows线程池199
7.2.1 Windows Vista线程池199
7.2.2 遗留的Win32线程池219
7.3 CLR线程池226
7.3.1 工作项226
7.3.2 I/O完成端口228
7.3.3 定时器231
7.3.4 注册等待233
7.3.5 记住(再次提醒):你并不拥有这些线程234
7.3.6 线程池的线程管理235
7.3.7 调试240
7.3.8 案例分析:优先级分层以及在线程池之上的隔离性241
7.4 在使用线程池时的性能244
7.5 小结249
延伸阅读249
第 8 章 异步编程模型251
8.1 异步编程模型(APM)251
8.1.1 汇集:四种方式253
8.1.2 实现IAsyncResult261
8.1.3 在.NET框架的哪些地方使用了APM265
8.1.4 ASP.NET异步页265
8.2 基于事件的异步模式266
8.2.1 基础知识267
8.2.2 支持取消269
8.2.3 支持进度报告以及增量结果269
8.2.4 在.NET框架的哪些地方将使用EAP270
8.3 小结270
延伸阅读271
第 9 章 纤程272
9.1 纤程简介272
优点与缺点273
9.2 纤程的使用275
9.2.1 创建新的纤程275
9.2.2 将线程转换为纤程277
9.2.3 判断线程是否为纤程278
9.2.4 纤程间的切换278
9.2.5 删除纤程279
9.2.6 切换当前线程的示例280
9.3 与纤程相关的其他主题282
9.3.1 纤程局部存储282
9.3.2 线程关联性283
9.3.3 案例分析:纤程与CLR285
9.4 构建用户态的调度器287
9.4.1 实现287
9.4.2 关于栈阻塞与无栈阻塞301
9.5 小结301
延伸阅读301
第三部分 技  术
第 10 章 内存模型与无锁编程303
10.1 内存加载与存储等操作的重新排序303
10.1.1 实际运行的顺序并非总是编写的顺序305
10.1.2 将临界域作为栅栏307
10.1.3 数据依赖性及其对重排的影响307
10.2 硬件原子性308
10.2.1 普通加载指令和存储指令的原子性309
10.2.2 互锁操作312
10.3 内存一致性模型322
10.3.1 硬件内存模型323
10.3.2 内存栅栏325
10.3.3 .NET内存模型328
10.3.4 无锁编程329
10.4 低锁代码的示例330
10.4.1 延迟初始化与双重检查锁定330
10.4.2 无阻塞栈和ABA问题341
10.4.3 重新回顾Dekker的算法345
10.5 小结346
延伸阅读346
第 11 章 并发的危害348
11.1 正确性危害348
11.1.1 数据竞争348
11.1.2 递归与重入354
11.1.3 锁与进程关闭358
11.2 活跃性危害366
11.2.1 死锁366
11.2.2 遗失的唤醒384
11.2.3 活锁386
11.2.4 锁护送效应388
11.2.5 “蜂拥”现象389
11.2.6 两步舞390
11.2.7 优先级反转与饥饿391
11.3 小结392
延伸阅读392
第 12 章 并行容器394
12.1 细粒度锁定395
12.1.1 数组395
12.1.2 FIFO队列396
12.1.3 链表399
12.1.4 字典(散列表)403
12.2 无锁408
12.2.1 无锁FIFO队列408
12.2.2 工作密迁队列411
12.3 协作式容器415
12.3.1 生产者/消费者数据结构415
12.3.2 通过栅栏来分阶段计算422
12.4 小结426
延伸阅读426
第 13 章 数据并行与任务并行427
13.1 数据并行428
13.2 任务并行444
13.2.1 分支/合并算法445
13.2.2 数据流并行(Future抽象与Promise抽象)447
13.2.3 递归457
13.2.4 流水线462
13.2.5 查找467
13.3 基于消息的并行468
13.4 一些共同问题469
13.4.1 并发的异常469
13.4.2 取消475
13.5 小结477
延伸阅读477
第 14 章  性能与可伸缩性478
14.1 并行硬件架构478
14.1.1 SMP、CMP与HT478
14.1.2 超标量执行479
14.1.3 内存的层次结构480
14.1.4 Visual Studio中的性能分析工具491
14.2  加速比:并行代码与串行代码492
14.2.1 决定“采用并行”492
14.2.2 测量并行带来的性能提升493
14.2.3 Amdahl定律496
12.2.4 关键路径以及负载不均衡497
14.2.5 垃圾收集与可伸缩性497
14.3 自旋等待498
14.3.1 如何在Windows上正确地自旋499
14.3.2 纯自旋锁502
14.3.3 Mellor-Crummey-Scott(MCS)锁506
14.4 小结508
延伸阅读509
第四部分 系  统
第 15 章 输入与输出511
15.1 重叠I/O511
15.1.1 重叠对象512
15.1.2 Win32异步I/O515
15.1.3 .NET框架的异步I/O534
15.2 I/O取消537
15.2.1 当前线程的异步I/O取消538
15.2.2 其他线程上的同步I/O取消538
15.2.3 任意线程的异步I/O取消539
15.3 小结539
延伸阅读540
第 16 章  图形用户界面541
16.1 GUI线程模型541
16.1.1 单线程套间(STA)543
16.1.2 响应度:它是什么545
16.2 .NET异步GUI功能545
16.2.1 .NET的GUI框架546
16.2.2 同步上下文552
16.2.3 异步操作558
16.2.4 一个方便的类:BackgroundWorker559
16.3 小结561
延伸阅读562
第五部分 附  录
附录 A 为.NET并发程序设计可重用的库563
附录 B .NET的并行扩展575

教学资源推荐
作者: (英) W. Bolton 著
作者: 刘粉林 刘九芬 罗向阳 等编著
作者: (美)Richard A. Brualdi 著 威斯康星大学麦迪逊分校
作者: 钱晓捷 主编
参考读物推荐
作者: [加] 伊姆兰·艾哈迈德(Imran Ahmad) 著
作者: 华诚科技 编著
作者: (美)杰格迪什.谢斯(Jagdish Sheth);拉金德拉.西索迪亚(Rajendra Sisodia )
作者: 红雨 杨枭齐 孙耕 刘源 著