关于本书

本书是使用并发和多线程的指导书籍,并基于C++最新标准(11,14,17)。从最基本的std::threadstd::mutexstd::async的使用,到复杂的原子操作和内存模型。

路线图

前4章,介绍了标准库中的各种工具,展示使用方法。

第5章,涵盖了内存模型和原子操作,包括原子操作如何对执行顺序进行限制(这章标志着介绍部分的结束)。

第6、7章,开始讨论高级主题,如何使用基本工具去构建复杂的数据结构——第6章是基于锁的数据结构,第7章是无锁数据结构。

第8章,针对设计多线程代码给了一些指导意见,覆盖了性能问题和并行算法。

第9章,线程管理——线程池,工作队列和中断操作。

第10章,介绍C++17中标准库算法对并行性的支持。

第11章,测试和调试——Bug类型,定位Bug的技巧,以及如何进行测试等等。

附录,包括新标准中语言特性的简要描述,主要是与多线程相关的特性,以及在第4章中提到的消息传递库的实现细节和C++17线程库的完整的参考。

适读人群

如果你正在用C++写一个多线程程序,可以阅读本书。如果你正在使用C++标准库中新的多线程工具,可以从本书中得到一些指导。如果你正在使用其他线程库,本书的建议和技术指导也很值得参考。

阅读本书需要有较好的C++基础,关于多线程编程的知识或者经验不是必须的。

如何阅读本书

如果从来没有写过多线程代码,我建议从头到尾阅读本书,可以跳过第5章中的较为细节的部分。

第7章内容依赖于第5章中的内容,如果跳过了第5章,应该在读第7章前,读一下第5章。

如果没有用过C++11,可以先看一下附录,当在正文中遇到一些没见过的工具或特性时,可以随时回看附录。

即使有不同环境下写多线程代码的经验,开始的章节仍有必要浏览一下,这样就能清楚地知道,你所熟知的工具在C++的新标准中对应于哪些工具。如果使用原子变量去做一些底层工作,第5章必读。第8章有关C++多线程的异常和安全性的内容很值得一看。如果对某些关键词比较感兴趣,索引和目录能够帮你快速找到相应的内容。

你可能喜欢回顾主要的章节,并用自己的方式阅读示例代码。虽然你已经了解C++线程库,但附录D还是很有用。例如,查阅每个类和函数的细节。

代码公约和下载

为了区分普通文本,清单和正文中的所有代码都采用像这样的固定宽度的字体。许多清单都伴随着代码注释,突出显示重要的概念。在某些情况下,你可以通过页下给出的快捷链接进行查阅。

本书所有实例的源代码,可在出版商的网站上进行下载:www.manning.com/books/c-plus-plus-concurrency-in-action-second-edition。

你也可以从github上下载源码:https://github.com/anthonywilliams/ccia_code_samples。

软件需求

使用书中的代码,需要一个较新的C++编译器(要支持C++17语言的特性(见附录A)),还需要C++支持标准线程库。

写本书的时候,最新版本的g++、clang++和Microsoft Visual Studio都对C++17的标准现成库进行了实现。他们也会支持附录中的大多数语言特性,那些目前还不被支持的特性也会逐渐被支持。

我的公司Software Solutions Ltd,销售C++11标准线程库的完整实现,其可以使用在一些旧编译器上,以及为新版本的clang、gcc和Microsoft Visual Studio实现的并发技术标准[1]。这个线程库也可以用来测试本书中的例子。

Boost线程库[2]提供的API,已经可移植到多个平台。本书中的大多数例子将std::替换为boost::,再#include引用相应的头文件,就能使用Boost线程库来运行。新标准中,部分编译器可能还不支持(例如std::async),或在Boost线程库中有着不同名字(例如:boost::unique_future)。

作者在线

购买C++ Concurrency in Action就能访问曼宁(Manning Publications)的私人网络论坛,在那里可以对本书做一些评论,问一些技术问题,获得作者或其他读者的帮助。

为了能够访问论坛和订阅它的内容,在浏览器地址中输入 https://www.manning.com/books/c-plus-plus-concurrency-in-action-second-edition

https://forums.manning.com/forums/about 页面将告诉你如何注册之后访问论坛,你能获得什么样的帮助,还有论坛中的一些规则。

曼宁保证为本书的读者提供互相交流,以及和作者交流的平台。虽然曼宁自愿维护本书论坛,但不保证这样的平台不会收取任何的费用。所以,可以给作者提一些有挑战性的问题,免得这样的地方白白浪费。


[1] The just::thread implementation of the C++ Standard Thread Library, http://www.stdthread.co.uk.

[2] The Boost C++ library collection, http://www.boost.org.