C++并发编程实战(第2版)
全新正版 极速发货
¥
58.2
4.2折
¥
139.8
全新
库存16件
作者(英)安东尼·威廉姆斯
出版社人民邮电出版社
ISBN9787115573551
出版时间2021-12
装帧平装
开本16开
定价139.8元
货号1202528951
上书时间2024-09-04
商品详情
- 品相描述:全新
- 商品描述
-
目录
第1章你好,C++并发世界1
1.1什么是并发2
1.1.1计算机系统中的并发2
1.1.2并发的方式4
1.1.3并发与并行5
1.2为什么使用并发技术6
1.2.1为分离关注点而并发6
1.2.2为性能而并发:任务并行和数据并行7
1.2.3什么时候避免并发8
1.3并发与C++多线程9
1.3.1C++多线程简史9
1.3.2新标准对并发的支持10
1.3.3C++14和C++17进一步支持并发和并行10
1.3.4标准C++线程库的效率10
1.3.5平台专属的工具12
1.4启程上路12
实例——“HelloConcurrentWorld”12
1.5小结13
第2章线程管控15
2.1线程的基本管控15
2.1.1发起线程16
2.1.2等待线程完成19
2.1.3在出现异常的情况下等待19
2.1.4在后台运行线程21
2.2向线程函数传递参数23
2.3移交线程归属权26
2.4在运行时选择线程数量30
2.5识别线程33
2.6小结35
第3章在线程间共享数据37
3.1线程间共享数据的问题38
3.1.1条件竞争39
3.1.2防止恶性条件竞争40
3.2用互斥保护共享数据41
3.2.1在C++中使用互斥41
3.2.2组织和编排代码以保护共享数据43
3.2.3发现接口固有的条件竞争44
3.2.4死锁:问题和解决方法51
3.2.5防范死锁的补充准则53
3.2.6运用std::unique_lock<>灵活加锁60
3.2.7在不同作用域之间转移互斥归属权61
3.2.8按适合的粒度加锁62
3.3保护共享数据的其他工具64
3.3.1在初始化过程中保护共享数据65
3.3.2保护甚少更新的数据结构68
3.3.3递归加锁70
3.4小结71
第4章并发操作的同步73
4.1等待事件或等待其他条件73
4.1.1凭借条件变量等待条件成立75
4.1.2利用条件变量构建线程安全的队列77
4.2使用future等待一次性事件发生82
4.2.1从后台任务返回值83
4.2.2关联future实例和任务85
4.2.3创建std::promise88
4.2.4将异常保存到future中90
4.2.5多个线程一起等待91
4.3限时等待94
4.3.1时钟类94
4.3.2时长类95
4.3.3时间点类97
4.3.4接受超时时限的函数99
4.4运用同步操作简化代码101
4.4.1利用future进行函数式编程101
4.4.2使用消息传递进行同步106
4.4.3符合并发技术规约的后续风格并发110
4.4.4后续函数的连锁调用112
4.4.5等待多个future115
4.4.6运用std::experimental::when_any()函数等待多个future,直到其中之一准备就绪117
4.4.7线程闩和线程卡——并发技术规约提出的新特性120
4.4.8基本的线程闩类std::experimental::latch121
4.4.9基本的线程卡类std::experimental::barrier122
4.4.10std::experimental::flex_barrier——std::experimental::barrier的灵活版本124
4.5小结125
第5章C++内存模型和原子操作127
5.1内存模型基础128
5.1.1对象和内存区域128
5.1.2对象、内存区域和并发129
5.1.3改动序列130
5.2C++中的原子操作及其类别131
5.2.1标准原子类型131
5.2.2操作std::atomic_flag135
5.2.3操作std::atomic137
5.2.4操作std::atomic:算术形式的指针运算139
5.2.5操作标准整数原子类型140
5.2.6泛化的std::atomic<>类模板141
5.2.7原子操作的非成员函数143
5.3同步操作和强制次序145
5.3.1同步关系147
5.3.2先行关系147
5.3.3原子操作的内存次序149
5.3.4释放序列和同步关系167
5.3.5栅栏169
5.3.6凭借原子操作令非原子操作服从内存次序171
5.3.7强制非原子操作服从内存次序172
5.4小结175
第6章设计基于锁的并发数据结构177
6.1并发设计的内涵178
6.2基于锁的并发数据结构179
6.2.1采用锁实现线程安全的栈容器180
6.2.2采用锁和条件变量实现线程安全的队列容器182
6.2.3采用精细粒度的锁和条件变量实现线程安全的队列容器186
6.3设计更复杂的基于锁的并发数据结构198
6.3.1采用锁编写线程安全的查找表198
6.3.2采用多种锁编写线程安全的链表204
6.4小结208
第7章设计无锁数据结构209
7.1定义和推论210
7.1.1非阻塞型数据结构210
7.1.2无锁数据结构211
7.1.3无须等待的数据结构212
7.1.4无锁数据结构的优点和缺点212
7.2无锁数据结构范例213
7.2.1实现线程安全的无锁栈214
7.2.2制止麻烦的内存泄漏:在无锁数据结构中管理内存217
7.2.3运用风险指针检测无法回收的节点223
7.2.4借引用计数检测正在使用中的节点231
7.2.5为无锁栈容器施加内存模型237
7.2.6实现线程安全的无锁队列242
7.3实现无锁数据结构的原则254
7.3.1原则1:在原型设计中使用std::memory_order_seq_cst次序254
7.3.2原则2:使用无锁的内存回收方案255
7.3.3原则3:防范ABA问题255
7.3.4原则4:找出忙等循环,协助其他线程256
7.4小结256
第8章设计并发代码257
8.1在线程间切分任务的方法258
8.1.1先在线程间切分数据,再开始处理258
8.1.2以递归方式划分数据259
8.1.3依据工作类别划分任务263
8.2影响并发代码性能的因素266
8.2.1处理器的数量266
8.2.2数据竞争和缓存乒乓(cacheping-pong)267
8.2.3不经意共享270
8.2.4数据的紧凑程度270
8.2.5过度任务切换与线程过饱和271
8.3设计数据结构以提升多线程程序的性能272
8.3.1针对复杂操作的数据划分272
8.3.2其他数据结构的访问模式275
8.4设计并发代码时要额外考虑的因素276
8.4.1并行算法代码中的异常安全276
8.4.2可伸缩性和Amdahl定律283
8.4.3利用多线程“掩藏”等待行为285
8.4.4借并发特性改进响应能力286
8.5并发代码的设计实践287
8.5.1std::for_each()的并行实现288
8.5.2std::find()的并行实现290
8.5.3std::partial_sum()的并行实现295
8.6小结305
第9章不错线程管理307
9.1线程池308
9.1.1最简易可行的线程池308
9.1.2等待提交给线程池的任务完成运行310
9.1.3等待其他任务完成的任务313
9.1.4避免任务队列上的争夺316
9.1.5任务窃取318
9.2中断线程322
9.2.1发起一个线程,以及把它中断323
9.2.2检测线程是否被中断324
9.2.3中断条件变量上的等待325
9.2.4中断条件变量std::condition_variable_any上的等待328
9.2.5中断其他阻塞型等待330
9.2.6处理中断331
9.2.7在应用程序退出时中断后台任务332
9.3小结333
第10章并行算法函数335
10.1并行化的标准库算法函数335
10.2执行策略336
10.2.1因指定执行策略而普遍产生的作用336
10.2.2std::execution::sequenced_policy337
10.2.3std::execution::parallel_policy338
10.2.4std::execution::parallel_unsequenced_policy339
10.3C++标准库的并行算法函数339
10.3.1并行算法函数的使用范例342
10.3.2访问计数344
10.4小结346
第11章多线程应用的测试和除错347
11.1与并发相关的错误类型347
11.1.1多余的阻塞348
11.1.2条件竞争348
11.2定位并发相关的错误的技法349
11.2.1审查代码并定位潜在错误350
11.2.2通过测试定位与并发相关的错误352
11.2.3设计可测试的代码353
11.2.4多线程测试技术355
11.2.5以特定结构组织多线程的测试代码357
11.2.6测试多线程代码的性能360
11.3小结360
附录AC++11精要:部分语言特性361
A.1右值引用361
A.1.1移动语义362
A.1.2右值引用和函数模板365
A.2删除函数366
A.3默认函数368
A.4常量表达式函数371
A.4.1constexpr关键字和用户定义型别373
A.4.2constexpr对象376
A.4.3constexpr函数要符合的条件376
A.4.4constexpr与模板377
A.5lambda函数377
A.6变参模板382
A.7自动推导变量的型别386
A.8线程局部变量387
A.9类模板的参数推导389
A.10小结389
附录B各并发程序库的简要对比391
附录C消息传递程序库和完整的自动柜员机范例393
内容摘要
这是一本介绍C++并发和多线程编程的深度指南。本书从C++标准程序库的各种工具讲起,介绍线程管控、在线程间共享数据、并发操作的同步、C++内存模型和原子操作等内容。同时,本书还介绍基于锁的并发数据结构、无锁数据结构、并发代码,以及不错线程管理、并行算法函数、多线程应用的测试和除错。本书还通过附录及线上资源提供丰富的补充资料,以帮助读者更完整、细致地掌握C++并发编程的知识脉络。
本书适合需要深入了解C++多线程开发的读者,以及使用C++进行各类软件开发的开发人员、测试人员,还可以作为C++线程库的参考工具书。
主编推荐
1.这是一本介绍C++并发和多线编程的深度指南,囊括了C++并发编程的多个方面,涉及启动新线程以及设计全功能的多线程算法和数据结构等核心知识点;
2.本书译文经过反复推敲,作译者协同参与全书内容的翻译和审读,代码配有详细的中文注释,内容简洁易懂;
3.译者还基于自己的开发经验,补充了许多延伸知识点,适合想要深入了解C++多线程的开发人员深入学习;
4.本书提供强大的配套资源,包括近200页的电子版附录D以及140多份配套代码文件。
媒体评论
“目前,对C++11多线程工具的探讨,本书是有关图书中较好的一本,而且在未来相当一段时期内还会如是。”
—— Effective C与More Effective C的作者Scott Meyers
“本书使C++多线程不那么晦涩难懂。”
——红帽(Red Hat)公司维护工程师Rick Wagner
“阅读本书让我头痛,然而痛有所得,好事。”
——Ingersoll Rand公司的Joshua Heyer
“Anthony示范了如何将并发用于实践。”
—— OR/2 Limited公司的Roger Orr
“一份关于C++新并发标准的指南,缜密而有深度,由标准制定者亲自编写。”
——瑞士信贷银行总监Neil Horlock
“任何严肃的C++开发人员应该读懂这本重要的书。”
——Pace公司开发总监Jamie Allsop博士
“本书是学习原子操作、内存模型和C++并发的上佳之选。”
——C++标准委员会成员,OpenMP执行官Michael Wong
— 没有更多了 —
以下为对购买帮助不大的评价