• C++并发编程实战(第2版)
  • C++并发编程实战(第2版)
  • C++并发编程实战(第2版)
  • C++并发编程实战(第2版)
  • C++并发编程实战(第2版)
21年品牌 40万+商家 超1.5亿件商品

C++并发编程实战(第2版)

新华集团 仓库直发

68.85 4.9折 139.8 全新

库存23件

浙江嘉兴
认证卖家担保交易快速发货售后保障

作者[英]安东尼·威廉姆斯(Anthony Williams)

出版社人民邮电出版社

出版时间2021-12

版次2

装帧其他

货号1202528951

上书时间2023-12-15

安安图书专营店

四年老店
已实名 已认证 进店 收藏店铺

   商品详情   

品相描述:全新
商品描述
目录
第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

图书标准信息
  • 作者 [英]安东尼·威廉姆斯(Anthony Williams)
  • 出版社 人民邮电出版社
  • 出版时间 2021-12
  • 版次 2
  • ISBN 9787115573551
  • 定价 139.80元
  • 装帧 其他
  • 开本 其他
  • 纸张 胶版纸
  • 页数 409页
  • 字数 573千字
【内容简介】
这是一本介绍C 并发和多线程编程的深度指南。本书从C 标准程序库的各种工具讲起,介绍线程管控、在线程间共享数据、并发操作的同步、C 内存模型和原子操作等内容。同时,本书还介绍基于锁的并发数据结构、无锁数据结构、并发代码,以及高级线程管理、并行算法函数、多线程应用的测试和除错。本书还通过附录及线上资源提供丰富的补充资料,以帮助读者更完整、细致地掌握C 并发编程的知识脉络。
  本书适合需要深入了解C 多线程开发的读者,以及使用C 进行各类软件开发的开发人员、测试人员,还可以作为C 线程库的参考工具书。
【作者简介】
安东尼·威廉姆斯(Anthony Williams),C 开发人员、顾问、培训师,英国标准协会C 标准组成员,拥有超过20年的C 开发经验,独立编写或合著了众多C 标准委员会文件,为C 11标准引入了线程库,实现了工具“just::thread Pro”(Just Software Solutions公司的产品),并持续致力于开发C 的新特性,以增强C 并发工具集的功能,这两者都遵循C 标准和提案。
【目录】
第 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.1 C 多线程简史 9

1.3.2 新标准对并发的支持 10

1.3.3 C 14和C 17进一步

支持并发和并行 10

1.3.4 标准C 线程库的效率 10

1.3.5 平台专属的工具 12

1.4 启程上路 12

实例—“Hello Concurrent World” 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::promise 88

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 等待多个future 115

4.4.6 运用std::experimental::when_any()函数等待多个

future,直到其中之一准备就绪 117

4.4.7 线程闩和线程卡——并发技术规约提出的新特性 120

4.4.8 基本的线程闩类std::experimental::latch 121

4.4.9 基本的线程卡类std::experimental::barrier 122

4.4.10 std::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.2 C 中的原子操作及其类别 131

5.2.1 标准原子类型 131

5.2.2 操作std::atomic_flag 135

5.2.3 操作std::atomic 137

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 数据竞争和缓存乒乓(cache ping-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.1 std::for_each()的并行实现 288

8.5.2 std::find()的并行实现 290

8.5.3 std::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.2 std::execution::sequenced_policy 337

10.2.3 std::execution::parallel_policy 338

10.2.4 std::execution::parallel_unsequenced_policy 339

10.3 C 标准库的并行算法函数 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

附录A C 11精要:部分语言特性 361

A.1 右值引用 361

A.1.1 移动语义 362

A.1.2 右值引用和函数模板 365

A.2 删除函数 366

A.3 默认函数 368

A.4 常量表达式函数 371

A.4.1 constexpr关键字和用户定义型别 373

A.4.2 constexpr对象 376

A.4.3 constexpr函数要符合的条件 376

A.4.4 constexpr与模板 377

A.5 lambda函数 377

A.6 变参模板 382

A.7 自动推导变量的型别 386

A.8 线程局部变量 387

A.9 类模板的参数推导 389

A.10 小结 389

附录B 各并发程序库的简要

对比 391

附录C 消息传递程序库和完整

的自动柜员机范例 393
点击展开 点击收起

   相关推荐   

—  没有更多了  —

以下为对购买帮助不大的评价

此功能需要访问孔网APP才能使用
暂时不用
打开孔网APP