目 录
第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章 并行合并计算 77
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