《C++ Concurrency in Action》中文版

2014年马上就到了,借此文感谢各位同学一直以来对并发编程网的支持和厚爱,祝大家新年快乐,并在新的一年里事事马到成功!在新的一年里如果您对并发编程网有什么要求,请只管在本文的回复里告诉我们。

至此新春之际,并发网和人民邮电出版社将在2014年向大家推送《C++ Concurrency in Action》中文版的样章,该书即将登场,而并发编程网让大家先睹为快!本文是第一篇,主要是包含本书的内容介绍,目录和译者介绍。喜欢的话请猛点赞。

内容介绍

本书是一本基于C++11新标准的并发和多线程编程深度指南。从std::thread、std::mutex、std::future和std::async等基础类的使用,到内存模型和原子操作、基于锁和无锁数据结构的构建,再扩展到并行算法、线程管理,最后还介绍了多线程代码的测试工作。本书的附录部分还对C++11新语言特性中与多线程相关的项目进行了简要的介绍,并提供了C++11线程库的完整参考。

本书适合于需要深入了解C++多线程开发的读者,以及使用C++进行各类软件开发的开发人员、测试人员。对于使用第三方线程库的读者,也可以从本书后面的章节中了解到相关的指引和技巧。同时,本书还可以作为C++11线程库的参考工具书。

目录

第1章 你好,C++的并发世界… 1

1.1 什么是并发… 1

1.1.1 计算机系统的并发… 1

1.1.2 并发的方法… 3

1.2 为什么使用并发… 4

1.2.1 因划分重点而使用并发… 5

1.2.2 为了提高性能而使用并发… 5

1.2.3 什么时候不使用并发… 6

1.3 在C++中使用并发和多线程… 7

1.3.1 多线程在C++中的发展历程… 7

1.3.2 新标准对于并发的支持… 8

1.3.3 C++线程库的效率… 8

1.3.4 平台相关的工具… 9

1.4 开始入门… 9

1.4.1 你好,并发世界… 9

1.5 小结… 10

第2章 线程管理… 13

2.1 基本线程管理… 13

2.1.1 启动线程… 13

2.1.2 等待线程完成… 16

2.1.3 在异常环境下的等待… 16

2.1.4 后台运行线程… 18

2.2 传递参数给线程函数… 19

2.3 转让线程的所有权… 21

2.4 在运行时选择线程数… 24

2.5 标识线程… 26

2.6 小结… 28

第3章 在线程间共享数据… 29

3.1 线程之间共享数据的问题… 29

3.1.1 竞争条件… 31

3.1.2 避免有问题的竞争条件… 31

3.2 用互斥元保护共享数据… 32

3.2.1 使用C++中的互斥元… 32

3.2.2 用于保护共享数据的结构化代码… 33

3.2.3 暴露接口中固有的竞争条件… 35

3.2.4 死锁:问题和解决方案… 41

3.2.5 避免死锁的进一步指导… 42

3.2.6 使用std::unique_lock灵活锁定… 47

3.2.7 在作用域之间转移锁的所有权… 48

3.2.8 锁定在适当的粒度… 49

3.3 用于共享数据保护的替代工具… 51

3.3.1 在初始化过程中保护共享数据… 51

3.3.2 保护很少更新的数据结构… 54

3.3.3 递归锁… 56

3.4 小结… 56

第4章 同步并发操作… 59

4.1 等待一个事件或其他条件… 59

4.1.1 使用条件变量的等待条件… 60

4.1.2 使用条件变量建立一个线程安全队列… 62

4.2 使用future来等待一次性事件… 67

4.2.1 从后台任务中返回值… 67

4.2.2 将任务与future相关联… 69

4.2.3 创建(std::)promise. 72

4.2.4 为future保存异常… 73

4.2.5 来自多个线程的等待… 75

4.3 在时间限制内等待… 77

4.3.1 时钟… 77

4.3.2 持续时间… 78

4.3.3 时间点… 79

4.3.4 接受超时的函数… 80

4.4 使用操作同步简化代码… 82

4.4.1 带有future的函数式编程… 82

4.4.2 具有消息传递的同步操作… 85

4.5 小结… 89

第5章 C++内存模型和原子类型上操作… 91

5.1 内存模型基础知识… 91

5.1.1 对象和内存位置… 91

5.1.2 对象,内存位置以及并发… 92

5.1.3 修改指令… 93

5.2 C++中的原子操作及类型… 93

5.2.1 标准原子类型… 94

5.2.2 std::atomic_flag运算… 96

5.2.3 基于std::atomic<bool>的操作… 97

5.2.4 std::atomic<T*>的操作:指针算术运算… 99

5.2.5 标准原子整数类型的操作… 100

5.2.6 std::atomic<>主要类模板… 101

5.2.7 原子操作的自由函数… 102

5.3 同步操作和执行排序… 103

5.3.1 synchronizes-with关系… 105

5.3.2 happens-before关系… 106

5.3.3 原子操作的内存排序… 107

5.3.4 释放序列和synchronize-with. 122

5.3.5 栅栏… 124

5.3.6 使用原子来排序非原子操作… 126

5.4 小结… 128

第6章 设计基于锁的并发数据结构… 129

6.1 为并发性而设计的含义是什么?… 129

6.1.1 为并发性设计数据结构的准则… 130

6.2 基于锁的并发数据结构… 131

6.2.1 使用锁的线程安全栈… 131

6.2.2 使用锁和条件变量的线程安全队列… 133

6.2.3 使用细粒度锁和条件变量的线程安全队列… 137

6.3 设计更为复杂的基于锁的数据结构… 148

6.3.1 编写一个使用锁的线程安全查找表… 148

6.3.2 编写一个使用锁的线程安全链表… 153

6.4 小结… 157

第7章 设计无锁的并发数据结构… 159

7.1 定义和结果… 159

7.1.1 无阻塞数据结构类型… 159

7.1.2 无锁的数据结构… 160

7.1.3 无等待数据结构… 160

7.1.4 无锁数据结构的有利和不利方面… 161

7.2 无锁数据结构的例子… 162

7.2.1 设计不使用锁的线程安全栈… 162

7.2.2 停止这些讨厌的泄漏:在无锁数据结构中管理内存… 166

7.2.3 用风险指针来检查哪些结点不能被回收… 170

7.2.4 使用引用计数侦测结点… 177

7.2.5 在无锁栈上应用内存模型… 181

7.2.6 写一个无锁的线程安全队列… 185

7.3 编写无锁数据结构的准则… 197

7.3.1 准则:使用std::memory_order_seq_cst做原型设计… 197

7.3.2 准则:使用无锁内存回收利用策略… 197

7.3.3 准则:当心ABA问题… 198

7.3.4 准则:识别忙则等待的循环以及帮助别的线程… 198

7.4 小结… 198

第8章 设计并行代码… 201

8.1 线程间划分工作的方法… 201

8.1.1 处理开始前在线程间划分数据… 202

8.1.2 递归地划分数据… 203

8.1.3 通过任务类型划分数据… 206

8.2 影响并发程序性能的因素… 208

8.2.1 有多少个处理器… 208

8.2.2 数据竞争和缓存的乒乓效应… 209

8.2.3 伪共享… 211

8.2.4 数据应该多紧密?… 211

8.2.5 过度订阅和过多的任务切换… 212

8.3 为多线程性能设计数据结构… 212

8.3.1 为复杂操作划分数组元素… 212

8.3.2 其它数据结构中的数据读取方式… 214

8.4 设计并发性时需要考虑的别的方面… 215

8.4.1 并行算法中的异常安全… 215

8.4.2 可扩展性和阿姆达尔定律… 222

8.4.3 用多线程隐藏等待时间… 223

8.4.4 提高并发的响应性… 223

8.5 在实际中设计并发代码… 225

8.5.1 std::for_each的并行实现… 226

8.5.2 std::find的并行实现… 228

8.5.3 std::partial_sum的并行实现… 232

8.6 总结… 241

第9章 高级线程管理… 243

9.1 线程池… 243

9.1.1 最简单的线程池实现… 244

9.1.2 等待任务的完成… 246

9.1.3 等待其他任务完成的任务… 249

9.1.4 避免工作队列的竞争… 252

9.1.5 任务偷取… 253

9.2 中断线程… 258

9.2.1 启动和中断另外一个线程… 258

9.2.2 检测一个线程是否被中断… 260

9.2.3 中断一个条件变量等待… 260

9.2.4 中断一个std::condition_variable_any变量… 263

9.2.5 中断其他阻塞调用… 265

9.2.6 处理中断… 266

9.2.7 在应用中中断后台任务… 266

9.3 总结… 268

第10章 多线程应用的测试和调试… 269

10.1 与并发相关的错误类型… 269

10.1.1 不必要的阻塞… 269

10.2 定位并发相关的错误的测试和调试技巧… 271

10.2.1 检阅代码定位潜在错误… 271

10.2.2 通过测试定位并行相关的错误… 272

10.2.3 易测性设计… 274

10.2.4 多线程测试技术… 275

10.2.5 构建多线程的测试代码… 277

10.2.6 测试多线程代码的性能… 279

10.3 总结… 280

附录A C++11部分语言特性简明参考… 281

A.1 右值引用… 281

A.1.1 移动语义… 282

A.1.2 右值引用与函数模版… 284

A.2 deleted函数… 284

A.3 defaulted函数… 286

A.4 constexpr函数… 289

A.4.1 constexpr与用户定义类型… 290

A.4.2 constexpr对象… 293

A.4.3 constexpr函数要求… 293

A.4.4 constexpr与模板… 294

A.5 lambda函数… 294

A.5.1 引用局部变量的lambda函数… 296

A.6 可变参数模板… 298

A.6.1 展开参数包… 299

A.7 自动推断变量的类型… 301

A.8 线程局部变量… 302

A.9 小结… 303

附录B 并发类库简要对比… 305

附录C 消息传递框架与完整的ATM示例… 307

附录D C++线程类库参考… 326

D.1 <chrono>头文件… 326

D.1.1 std::chrono::duration类模板… 326

D.1.2 std::chrono::time_point类模板… 336

D.1.3 std::chrono::system_clock类… 339

D.1.4 std::chrono::steady_clock类… 341

D.1.5 std::chrono::high_resolution_clock typedef 342

D.2 <condition_variable>头文件… 343

D.2.1 std::condition_variable类… 343

D.2.2 std::condition_variable_any类… 351

D.3 <atomic>头文件… 359

D.3.1 std::atomic_xxx typedef 361

D.3.2 ATOMIC_xxx_LOCK_FREE宏… 361

D.3.3 ATOMIC_VAR_INIT宏… 362

D.3.4 std::memory_order枚举… 362

D.3.5 std::atomic_thread_fence函数… 363

D.3.6 std::atomic_signal_fence函数… 363

D.3.7 std::atomic_flag类… 364

D.3.8 std::atomic类模板… 367

D.3.9 std::atomic模板的特化… 378

D.3.10 std::atomic<integral-type>特化… 379

D.3.11 std::atomic<T*>偏特化… 392

D.4 <future>头文件… 398

D.4.1 std::future类模板… 399

D.4.2 std::shared_future类模板… 405

D.4.3 std::packaged_task类模板… 410

D.4.4 std::promise类模板… 416

D.4.5 std::async函数模板… 422

D.5 <mutex>头文件… 423

D.5.1 std::mutex类… 424

D.5.2 std::recursive_mutex类… 426

D.5.3 std::timed_mutex类… 429

D.5.4 std::recursive_timed_mutex类… 433

D.5.5 std::lock_guard类模板… 438

D.5.6 std::unique_lock类模板… 439

D.5.7 std::lock函数模板… 450

D.5.8 std::try_lock函数模板… 450

D.5.9 std::once_flag类… 451

D.5.10 std::call_once函数模板… 451

D.6 <ratio>头文件… 452

D.6.1 std::ratio类模板… 453

D.6.2 std::ratio_add模板别名… 454

D.6.3 std::ratio_subtract模板别名… 455

D.6.4 std::ratio_multiply模板别名… 455

D.6.5 std::ratio_divide模板别名… 456

D.6.6 std::ratio_equal类模板… 456

D.6.7 std::ratio_not_equal类模板… 457

D.6.8 std::ratio_less类模板… 457

D.6.9 std::ratio_greater类模板… 458

D.6.10 std::ratio_less_equal类模板… 458

D.6.11 std::ratio_greater_equal类模板… 459

D.7 <thread>头文件… 459

D.7.1 std::thread类… 459

D.7.2 this_thread命名空间… 469

资源… 471

印刷资源… 471

在线资源… 471

译者简介

  • 周全,软件工程师,毕业于中国科学技术大学信息学院,现任职于中国人民银行合肥中心支行科技处。从事.NET开发多年,有较为丰富的系统集成和运维经验,对虚拟化也有较深入的研究。可以通过email: spadeq@live.com与他联系。
  • 宋真真,网络工程师,2008年毕业于合肥工业大学计算机与信息学院,现任职于中国人民银行合肥中心支行科技处,参与软件开发、项目管理等工作,爱好数据库、编程等研究。可以通过email: hfut_szz@sina.com与她联系。
  • 梁娟娟,2010年毕业于中国科学技术大学信息技术学院,现就职于中国人民银行合肥中心支行。
  •  许敏,软件工程师,2005年获得软件测试工程师证书。现任职于中国人民银行合肥中心支行科技处,负责项目管理工作。可以通过Email: xu_min@sina.com与她联系。
时间: 2025-01-21 03:23:16

《C++ Concurrency in Action》中文版的相关文章

《Storm入门》中文版

本文翻译自<Getting Started With Storm>译者:吴京润    编辑:郭蕾 方腾飞 本书的译文仅限于学习和研究之用,没有原作者和译者的授权不能用于商业用途. 译者序 Storm入门终于翻译完了.首先感谢并发编程网同意本人在网站上首发本书译文,同时还要感谢并发编程网的各位大牛们的耐心帮助.这是本人翻译的第一本书,其中必有各种不足请诸位读者朋友不吝斧正. 译完此书之后,我已经忘记了是如何知道的Storm这个工具了.本人读过的所有技术书籍大部分都是在地铁上完成的,现在已经成了习

Storm入门之第8章事务性拓扑

Storm入门之第8章事务性拓扑 本文翻译自<Getting Started With Storm>译者:吴京润    编辑:郭蕾 方腾飞 正如书中之前所提到的,使用Storm编程,可以通过调用ack和fail方法来确保一条消息的处理成功或失败.不过当元组被重发时,会发生什么呢?你又该如何砍不会重复计算?   Storm0.7.0实现了一个新特性--事务性拓扑,这一特性使消息在语义上确保你可以安全的方式重发消息,并保证它们只会被处理一次.在不支持事务性拓扑的情况下,你无法在准确性,可扩展性,以

MyEclipse Hibernate 快速入门中文版与Hibernate的相关配置属性

MyEclipse Hibernate 快速入门中文版的HTML完整版本下载地址:  http://beansoft.java-cn.org/download/MyEclipse_Hibernate_Quickstart_zh_CN.zip 719KB Hibernate配置属性 属性名 用途 hibernate.dialect Hibernate方言(Dialect)的类名 - 可以让Hibernate使用某些特定的数据库平台的特性 取值. full.classname.of.Dialect

Storm入门之附录C

本文翻译自<Getting Started With Storm>译者:吴京润    编辑:郭蕾 方腾飞 安装实际的例子 译者注:有些软件的最新版本已有变化,译文不会完全按照原文翻译,而是列出当前最新版本的软件. 首先,从下述GitHub的URL克隆这个例子: 1 > git clone git://github.com/storm-book/examples-ch06-real-life-app.git src/main 包含拓扑的源码 src/test 包含拓扑的测试用例 webap

Storm入门 第二章准备开始

本文翻译自<Getting Started With Storm>  译者:吴京润   编辑:方腾飞 准备开始 在本章,我们要创建一个Storm工程和我们的第一个Storm拓扑结构. NOTE: 下面假设你的JRE版本在1.6以上.我们推荐Oracle提供的JRE.你可以到http://www.java .com/downloads/下载. 操作模式 开始之前,有必要了解一下Storm的操作模式.有下面两种方式. 本地模式 在本地模式下,Storm拓扑结构运行在本地计算机的单一JVM进程上.这

Storm入门之第三章拓扑

本文翻译自<Getting Started With Storm>  译者:吴京润   编辑:方腾飞 在这一章,你将学到如何在同一个Storm拓扑结构内的不同组件之间传递元组,以及如何向一个运行中的Storm集群发布一个拓扑. 数据流组 设计一个拓扑时,你要做的最重要的事情之一就是定义如何在各组件之间交换数据(数据流是如何被bolts消费的).一个数据流组指定了每个bolt会消费哪些数据流,以及如何消费它们. NOTE:一个节点能够发布一个以上的数据流,一个数据流组允许我们选择接收哪个. 数据

Storm入门之第四章Spouts

本文翻译自<Getting Started With Storm>  译者:吴京润   编辑:方腾飞 你将在本章了解到spout作为拓扑入口和它的容错机制相关的最常见的设计策略. 可靠的消息 VS 不可靠的消息 在设计拓扑结构时,始终在头脑中记着的一件重要事情就是消息的可靠性.当有无法处理的消息时,你就要决定该怎么办,以及作为一个整体的拓扑结构该做些什么.举个例子,在处理银行存款时,不要丢失任何事务报文就是很重要的事情.但是如果你要统计分析数以百万的tweeter消息,即使有一条丢失了,仍然可

Storm入门之附录A

本文翻译自<Getting Started With Storm>译者:吴京润    编辑:郭蕾 方腾飞 安装Storm客户端 Storm客户端能让我们使用命令管理集群中的拓扑.按照以下步骤安装Storm客户端: 从Storm站点下载最新的稳定版本(https://github.com/nathanmarz/storm/downloads)当前最新版本是storm-0.8.1.(译者注:原文是storm-0.6.2,不过翻译的时候已经是storm-0.8.1了) 把下载的文件解压缩到/usr/

Storm入门之附录B

本文翻译自<Getting Started With Storm>译者:吴京润    编辑:郭蕾 方腾飞 安装Storm集群 译者注:本附录的内容已经有些陈旧了.最新的Storm已不再必须依赖ZeroMQ,各种依赖的库和软件也已经有更新的版本. 有以下两种方式创建Storm集群: 使用Storm部署在亚马逊EC2上面创建一个集群,就像你在第6章看到的. 手工安装(详见本附录) 要手工安装Storm,需要先安装以下软件 Zookeeper集群(安装方法详见管理向导) Java6.0 Python

Storm入门之第一章

原书下载地址 译者:吴京润   编辑:方腾飞 译者注:本文翻译自<Getting Started With Storm>,本书中所有Storm相关术语都用斜体英文表示. 这些术语的字面意义翻译如下,由于这个工具的名字叫Storm,这些术语一律按照气象名词解释 spout 龙卷,读取原始数据为bolt提供数据 bolt 雷电,从spout或其它bolt接收数据,并处理数据,处理结果可作为其它bolt的数据源或最终结果 nimbus 雨云,主节点的守护进程,负责为工作节点分发任务. 下面的术语跟气