关于本书
本书是一份深度指南,内容是 C++新标准中涉及的并发与多线程功能,从std::thread、std::mutex和std::async的基本使用方法开始,一直到复杂的内存模型和原子操作。
本书的组织结构
第1~4章介绍C++标准程序库提供的各种工具,并说明如何使用。
第5章剖析C++内存模型和原子操作的底层核心细节,包括如何运用原子操作强制约束其他线程代码的执行顺序,这是本书入门部分的最后一章。
第6章和第7章开始进入高级主题,通过范例解释如何使用基础工具构建复杂的数据结构。第6章研究基于锁的并发数据结构,第7章分析无锁数据结构。
第8章继续高级主题,涉及多线程代码设计的指导原则、影响性能的各种因素,还有并行算法函数的实现范例。
第9章探讨高级线程管理,包括线程池、工作队列和中断线程。
第10章探讨C++17所支持的新引入的并行特性,它们以重载的形式实现了许多标准库算法函数。
第11章探讨测试和除错,包括错误的类型、定位错误的技法、如何测试等。
附录包含以下内容:附录A简单介绍新标准引入的与多线程相关的新特性;附录B是几个并发程序库之间的简要对比;附录C是消息传递程序库的实现细节,该库最先在第4章中提及;附录D是一份完整的C++线程库参考名录(作为电子资源配套提供,读者可从异步社区下载)。
目标读者
如果你要用C++编写多线程代码,就应该阅读本书;如果你想使用C++标准程序库中的多线程工具,那么本书可作为基础指南;如果你要用到其他线程库,本书后面的章节也给出了指导原则和技巧,仍会让你获益。
我假设读者已具备了良好的C++实操知识,却不太熟悉C++的新特性。为此,附录A将补充相关内容。
如何阅读本书
如果读者以前没有编写过多线程代码,我建议按顺序从头到尾阅读本书。
假若读者之前没使用过C++11的新功能,那就需要先浏览一下附录A,再开始阅读正文,这将有助于透彻理解本书的代码示例。正文中已经标注出用到C++新特性的地方,尽管如此,一旦你遇到任何从未见过的内容,也可以随时翻查附录。
如果读者已经编写过多线程代码,并且经验丰富,前几章会让你知晓已经熟知的工具与新标准的C++工具是怎样对应的。倘若读者要进行任何底层工作,涉及原子变量,则第5章必不可少。为了确保读者真正熟知C++多线程编程的各种细节,例如异常安全(exception safety),那么,第8章值得好好学习。如果读者肩负某种特定的编码任务,索引和目录会帮你迅速定位到有关章节。
即便你已经掌握了C++线程库的使用方法,附录D(可从异步社区下载)依然有用,例如可供你查阅各个类和函数调用的精准细节。你也可以考虑时不时地回顾一下主要章节,或强化记忆某个特定的模型,或重温示例代码。
代码约定
代码清单都采用等宽字体(示例:fixed-width font
)以区分于普通文本。许多代码清单都附有代码注解,标记出重要的概念。在一些代码清单中,代码通过有编号的圆形标志与随后正文的解释相对应。
软件要求
为了能够原封不动地使用本书中的代码,读者需要安装新近发布的C++编译器,以支持示例中C++11的语言特性(见附录A),另外还需要C++标准线程库。
我在编写本书的时候,g++、Clang++和Visual Studio发布的新版本全都实现了C++标准线程库的支持。它们同样支持附录列出的绝大部分语言特性,而未获支持的特性也将很快得到支持。
我的公司Just Software Solutions出售C++11标准线程库的完整实现[1],也出售符合并发技术规约的程序库实现。前者适用于好几个相对较旧的编译器,后者则适用于较新版本的Clang、GCC和Visual Studio,后者也可用于测试本书的代码。
Boost线程库[2]提供了一套API,这套API以C++11标准线程库的提案为依据,可以移植到许多平台上。本书的绝大多数示例代码稍作改动就能使用Boost线程库,这些改动包括将std::with全部替换为boost::and,以及用#include预处理指令包含恰当的头文件。Boost线程库内有少部分功能未获支持(如std::async)或者名字不同(如boost::unique_ future)。
[1] C++11标准线程库的just::thread实现。
[2] Boost C++程序库。