内容简介

  《C++并发编程实战》是一本基于C++11新标准的并发和多线程编程深度指南。内容包括从std::thread、std::mutex、std::future和std::async等基础类的使用,到内存模型和原子操作、基于锁和锁数据结构的构建,再扩展到并行算法、线程管理,最后还介绍了多线程代码的测试工作。《C++并发编程实战》的附录部分还对C++11新语言特性中与多线程相关的项目进行了简要的介绍,并提供了C++11线程库的完整参考。
  《C++并发编程实战》适合于需要深入了解C++多线程开发的读者,以及使用C++进行各类软件开发的开发人员、测试人员。对于使用第三方线程库的读者,也可以从《C++并发编程实战》后面的章节中了解到相关的指引和技巧。同时,《C++并发编程实战》还可以作为C++11线程库的参考工具书。

作者简介

  周全,软件工程师,毕业于中国科学技术大学信息学院,现任职于中国人民银行合肥中心支行科技处。从事.NET开发多年,有较为丰富的系统集成和运维经验,对虚拟化也有较深入的研究。可以通过email与他联系。

  宋真真,网络工程师,2008年毕业于合肥工业大学计算机与信息学院,现任职于中国人民银行合肥中心支行科技处,参与软件开发、项目管理等工作,爱好数据库、编程等研究。可以通过email与她联系。

  梁娟娟,2010年毕业于中国科学技术大学信息技术学院,现就职于中国人民银行合肥中心支行。

  许敏,软件工程师,2005年获得软件测试工程师证书。现任职于中国人民银行合肥中心支行科技处,负责项目管理工作。可以通过Email与她联系。

目录

第1章你好,C++并发世界1
1.1什么是并发2
1.1.1计算机系统中的并发2
1.1.2并发的途径3
1.2为什么使用并发5
1.2.1为了划分关注点而使用
并发5
1.2.2为了性能而使用并发6
1.2.3什么时候不使用并发7
1.3在C++中使用并发和
多线程8
1.3.1C++多线程历程8
1.3.2新标准中的并发支持9
1.3.3C++线程库的效率9
1.3.4平台相关的工具10
1.4开始入门11
1.5小结12
第2章管理线程13
2.1基本线程管理13
2.1.1启动线程14
2.1.2等待线程完成16
2.1.3在异常环境下的等待17
2.1.4在后台运行线程19
2.2传递参数给线程函数20
2.3转移线程的所有权23
2.4在运行时选择线程
数量26
2.5标识线程28
2.6小结29
第3章在线程间共享数据31
3.1线程之间共享数据的
问题32
3.1.1竞争条件33
3.1.2避免有问题的竞争
条件34
3.2用互斥元保护共享
数据35
3.2.1使用C++中的互斥元35
3.2.2为保护共享数据精心组织
代码36
3.2.3发现接口中固有的竞争
条件38
3.2.4死锁:问题和解决方案44
3.2.5避免死锁的进一步
指南46
3.2.6用std::unique_lock灵活
锁定51
3.2.7在作用域之间转移锁的
所有权52
3.2.8锁定在恰当的粒度54
3.3用于共享数据保护的替代工具56
3.3.1在初始化时保护共享
数据56
3.3.2保护很少更新的数据
结构59
3.3.3递归锁61
3.4小结62
第4章同步并发操作63
4.1等待事件或其他条件63
4.1.1用条件变量等待条件65
4.1.2使用条件变量建立一个
线程安全队列67
4.2使用future等待一次性
事件71
4.2.1从后台任务中返回值72
4.2.2将任务与future相关联74
4.2.3生成(std::)promise77
4.2.4为future保存异常79
4.2.5等待自多个线程80
4.3有时间限制的等待82
4.3.1时钟83
4.3.2时间段84
4.3.3时间点85
4.3.4接受超时的函数86
4.4使用操作同步来简化
代码88
4.4.1带有future的函数式
编程88
4.4.2具有消息传递的同步
操作92
4.5小结96
第5章C++内存模型和原子
类型上操作97
5.1内存模型基础98
5.1.1对象和内存位置98
5.1.2对象、内存位置以及
并发99
5.1.3修改顺序100
5.2C++中的原子操作及
类型100
5.2.1标准原子类型101
5.2.2std::atomic_flag上的
操作103
5.2.3基于std::atomic的
操作105
5.2.4std::atomic上的操作:指针算术运算107
5.2.5标准原子整型的
操作108
5.2.6std::atomic初级类
模板109
5.2.7原子操作的自由函数111
5.3同步操作和强制
顺序112
5.3.1synchronizes-with
关系114
5.3.2happens-before关系114
5.3.3原子操作的内存
顺序116
5.3.4释放序列和
synchronizes-with133
5.3.5屏障135
5.3.6用原子操作排序非原子
操作137
5.4小结138
第6章设计基于锁的并发
数据结构140
6.1为并发设计的含义是
什么141
6.2基于锁的并发数据
结构142
6.2.1使用锁的线程
安全栈142
6.2.2使用锁和条件变量的线程
安全队列145
6.2.3使用细粒度锁和条件变量的线程安全队列149
6.3设计更复杂的基于锁的
数据结构160
6.3.1编写一个使用锁的线程
安全查找表160
6.3.2编写一个使用锁的线程
安全链表165
6.4小结169
第7章设计锁的并发数据
结构170
7.1定义和结果171
7.1.1非阻塞数据结构的
类型171
7.1.2锁数据结构172
7.1.3等待的数据结构172
7.1.4锁数据结构的优点与
缺点172
7.2锁数据结构的
例子173
7.2.1编写不用锁的线程
安全栈174
7.2.2停止恼人的泄漏:在锁数据结构中管理内存178
7.2.3用风险指针检测不能被
回收的结点182
7.2.4使用引用计数检测
结点189
7.2.5将内存模型应用至
锁栈194
7.2.6编写不用锁的线程安全
队列198
7.3编写锁数据结构的
准则209
7.3.1准则:使用std::memory_order_
seq_cst作为原型210
7.3.2准则:使用锁内存回收
模式210
7.3.3准则:当心ABA问题210
7.3.4准则:识别忙于等待的循环以及辅助其他线程211
7.4小结211
第8章设计并发代码213
8.1在线程间划分工作的
技术214
8.1.1处理开始前在线程间划分
数据214
8.1.2递归地划分数据215
8.1.3以任务类型划分
工作219
8.2影响并发代码性能的
因素222
8.2.1有多少个处理器222
8.2.2数据竞争和乒乓
缓存223
8.2.3假共享225
8.2.4数据应该多紧密225
8.2.5过度订阅和过多的任务
切换226
8.3为多线程性能设计数据
结构226
8.3.1为复杂操作划分数组
元素227
8.3.2其他数据结构中的数据
访问方式228
8.4为并发设计时的额外
考虑230
8.4.1并行算法中的异常
安全230
8.4.2可扩展性和阿姆达尔
定律237
8.4.3用多线程隐藏延迟238
8.4.4用并发提高响应性239
8.5在实践中设计并发
代码241
8.5.1std::for_each的并行
实现241
8.5.2std::find的并行实现243
8.5.3std::partial_sum的并行
实现248
8.6总结256
第9章高级线程管理258
9.1线程池259
9.1.1最简单的线程池259
9.1.2等待提交给线程池的
任务261
9.1.3等待其他任务的
任务265
9.1.4避免工作队列上的
竞争267
9.1.5工作窃取269
9.2中断线程273
9.2.1启动和中断另一个
线程274
9.2.2检测一个线程是否被
中断275
9.2.3中断等待条件变量276
9.2.4中断在std::condition_variable_any上的等待279
9.2.5中断其他阻塞调用281
9.2.6处理中断281
9.2.7在应用退出时中断后台
任务282
9.3总结284
第10章多线程应用的测试与
调试285
10.1并发相关错误的
类型285
10.1.1不必要的阻塞286
10.1.2竞争条件286
10.2定位并发相关的错误的
技巧288
10.2.1审阅代码以定位潜在的
错误288
10.2.2通过测试定位并发相关的
错误290
10.2.3可测试性设计291
10.2.4多线程测试技术292
10.2.5构建多线程的测试
代码295
10.2.6测试多线程代码的
性能297
10.3总结298
附录A附录AC++11部分
语言特性简明
参考299
附录B并发类库

其他推荐