第1章 导论 1
1.1潜在并行性的重要性 2
1.2分解、协调和可扩展共享 3
1.2.1了解任务 4
1.2.2协调任务 5
1.2.3数据的可扩展共享 5
1.2.4设计方法 6
1.3选择恰当的模式 7
1.4关于术语 8
1.5并行性的极限 9
1.6一些技巧 11
1.7练习 12
1.8扩展阅读 12
第2章 并行循环 15
2.1基础知识 16
2.1.1并行for循环 16
2.1.2并行ForEach循环 17
2.1.3并行LINQ(PLINQ) 18
2.1.4预期 19
2.2示例 21
2.2.1信贷审查的顺序版本示例 22
2.2.2使用Parallel.ForEach的信贷审查示例 23
2.2.3 PLINQ信贷审查示例 23
2.2.4性能比较 24
2.3变化形式 24
2.3.1尽早中断循环 25
2.3.2外部循环取消 29
2.3.3异常处理 30
2.3.4小循环体的特殊处理 31
2.3.5控制并行度 33
2.3.6在循环体中使用局部任务状态 35
2.3.7对并行循环使用自定义的任务调度程序 36
2.4反模式 37
2.4.1步长不为一 37
2.4.2隐藏的循环体依赖 38
2.4.3少量迭代的小循环体 38
2.4.4处理器的超额申请和申请不足 38
2.4.5混合Parallel类和PLINQ 39
2.4.6输入枚举中的重复 39
2.5设计说明 40
2.5.1自适应分区 40
2.5.2自适应并发 40
2.5.3支持嵌套循环和服务器应用程序 41
2.6相关模式 41
2.7练习 42
2.8扩展阅读 43
第3章 并行任务 45
3.1基础知识 46
3.2示例 47
3.3变化形式 50
3.3.1取消任务 50
3.3.2处理异常 52
3.3.3等待第一个任务完成 56
3.3.4推测执行 57
3.3.5使用自定义的调度方式创建任务 59
3.4反模式 60
3.4.1闭包捕获的变量 60
3.4.2清理任务所需要的资源 61
3.4.3避免撤销线程 62
3.5设计说明 62
3.5.1任务和线程 62
3.5.2任务生命周期 62
3.5.3编写自定义的任务调度程序 64
3.5.4未观测到的任务异常 64
3.5.5数据并行性和任务并行性之间的关系 65
3.6默认任务调度程序 66
3.6.1线程池 66
3.6.2分散管理的调度技术 68
3.6.3 work stealing策略 69
3.6.4全局队列中的顶层任务 70
3.6.5局部队列中的子任务 70
3.6.6子任务的内联执行 71
3.6.7线程注入 72
3.6.8绕过线程池 74
3.7练习 74
3.8扩展阅读 75
第4章 并行合并计算 7
4.1基础知识 77
4.2示例 80
4.3变化形式 84
4.3.1使用并行循环进行合并计算 84
4.3.2使用范围分割器进行合并计算 87
4.3.3使用带有范围选择的PLINQ合并计算 89
4.4设计说明 91
4.5相关的模式 94
4.6练习 94
4.7扩展阅读 95
第5章future模式 97
5.1基础知识 98
5.1.1 future 98
5.1.2延续任务 101
5.2示例:Adatum金融仪表板 102
5.2.1业务对象 104
5.2.2分析引擎 104
5.2.3视图和视图模型 110
5.3变化形式 110
5.3.1取消future和延续任务 111
5.3.2拥有多个先行任务的情况 111
5.3.3使用.NET异步调用和future 111
5.3.4消除瓶颈 112
5.3.5运行时修改图 112
5.4设计说明 113
5.4.1分解成future和延续任务 113
5.4.2函数式风格 113
5.5相关的模式 114
5.5.1流水线模式 114
5.5.2主/从(master/worker)模式 114
5.5.3动态任务并行模式 114
5.5.4离散事件模式 115
5.6练习 115
5.7扩展阅读 115
第6章 动态任务并行 119
6.1基础 119
6.2示例 121
6.3变化形式 123
6.3.1 while-not-empty并行 123
6.3.2任务链与父子任务 125
6.4设计说明 126
6.5练习 127
6.6扩展阅读 127
第7章 流水线 129
7.1基础 129
7.2示例 134
7.2.1顺序图像处理 134
7.2.2图像流水线 135
7.2.3运行特性 137
7.3变化形式 139
7.3.1取消流水线 139
7.3.2处理流水线异常 141
7.3.3利用多个生产者实现负载平衡 144
7.3.4流水线和流 146
7.3.5异步流水线 147
7.4反模式 147
7.4.1线程饥饿 147
7.4.2阻塞集合无穷等待 147
7.4.3忘记GetConsumingEnumerable()方法 148
7.4.4采用其他生产者/消费者集合 148
7.5设计说明 148
7.6相关模式 149
7.7练习 149
7.8扩展阅读 150
附录A改写面向对象模式 151
附录B调试和分析并行应用程序 183
附录C技术概览 197
术语表 201
参考文献 211