对C++程序员来说,现在是激动人心的新时代。初版的C++标准于1998年发布,历经13年,C++标准委员会对语言本身及其标准库做出重大修整。经过大幅度变革,新标准(以下简称C++11或C++0x)于2011年发布,使C++用起来更得心应手,事半功倍。委员会遵守“班车模式”的新式发布规则,每隔3年发布一版新的C++标准。目前,已经有两版标准依次发布——C++14和C++17,还有几份技术规约作为C++标准的扩充。
C++11标准最重要的新特性之一是支持多线程。这是标准首次接纳原生语言层面的多线程应用,并在标准库中为之提供组件。这使得多线程C++程序的编写无须依赖平台专属的扩展(platform-specific extension),因而我们得以写出可移植的、行为确定的多线程代码。并且,新标准的发布正当其时:为改进应用程序的性能,程序员普遍日益寄望于并发技术,特别是多线程编程。以C++11为基础,委员会相继发布了C++14标准、C++17标准和一些技术规约,进一步为编写多线程程序提供支持。在这些技术规约中,其中一份针对并发特性的扩展,而针对并行特性的扩展另有一份,后者已被正式纳入C++17标准。
1.这是一本介绍C++并发和多线编程的深度指南,囊括了C++并发编程的多个方面,涉及启动新线程以及设计全功能的多线程算法和数据结构等核心知识点;
2.本书译文经过反复推敲,作译者协同参与全书内容的翻译和审读,代码配有详细的中文注释,内容简洁易懂;
3.译者还基于自己的开发经验,补充了许多延伸知识点,适合想要深入了解C++多线程的开发人员深入学习;
4.本书提供强大的配套资源,包括近200页的电子版附录D以及140多份配套代码文件。
本书作者是并发编程的世界级专家,经验丰富、见多识广。对于本书涉及的各种技术难点,他都驾轻就熟。反之,本书的不少读者仍在学习的艰途上步履蹒跚,若要跟上“巨人”的步伐,恐怕比较吃力。原书中的某些要点在作者眼中理所当然,并没有予以详细介绍,而这些内容很可能令人费解。为此,本人特意插入不少译者注,通过解释细节以补充正文的完整逻辑,帮助读者轻松理解。此外,虽然原书定位的目标读者是已具备相当经验的C++程序员,但是很多C++新手和跨专业的开发者也会对多线程感兴趣。因此,本人还补注了一些计算机软硬件知识和对C++新特性的说明,以尽量降低本书的学习难度。
假定我们已经拥有一个优良的编译器,其符合C++11、C++14、C++17标准。
从何入手?
多线程C++程序长什么样子?它看起来非常像其他C++程序,由常见的变量、类和函数组成。他们之间真正的区别仅仅在于某些函数可能并发运行,因而必须保证共享数据能安全、可靠地被并发访问,第3章将对此展开介绍。为了并发运行函数,我们必须使用特定的函数和对象,以管控不同的线程。
第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(可从异步社区下载)依然有用,例如可供你查阅各个类和函数调用的精准细节。你也可以考虑时不时地回顾一下主要章节,或强化记忆某个特定的模型,或重温示例代码。
安东尼·威廉姆斯(Anthony Williams)来自英国,他是开发者、顾问、培训师,积累了超过20年的C++开发经验。从2001年起,他成为英国标准协会 C++标准专家组的成员,独立编写或参与编写了许多 C++标准委员会的文件,使 C++11 标准引入了线程库。现在,他继续致力于开发 C++的新特性,以增强 C++并发工具集的功能,这两者都遵循C++标准和提案。他还扩展了 C++线程库,实现了工具“just::thread Pro”(Just Software Solutions公司的产品)。