关于这本书
本书是并发和多线程机制指导书籍(基于C++11标准)。从最基本的std::thread std::mutex
和std::async
的使用,到复杂的原子操作和内存模型。
路线图
前4章,介绍了标准库提供的各种库工具,展示了使用方法。
第5章,涵盖了底层内存模型和原子操作的实际情况,包括原子操作如何对执行顺序进行限制(这章标志着介绍部分的结束)。
第6、7章,开始讨论高级主题,如何使用基本工具去构建复杂的数据结构——第6章是基于锁的数据结构,第7章是无锁数据结构。
第8章,对设计多线程代码给了一些指导意见,覆盖了性能问题和并行算法。
第9章,线程管理——线程池,工作队列和中断操作。
第10章,测试和调试——bug类型,定位Bug的技巧,以及如何进行测试等等。
附录,包括新的语言特性的简要描述,主要是与多线程相关的特性,以及在第4章中提到的消息传递库的实现细节和C++11线程库的完整的参考。
谁应该读这本书
如果你正在用C++写一个多线程程序,你应该阅读本书。如果你正在使用C++标准库中新的多线程工具,你可以从本书中得到一些指导意见。如果你正在使用其他线程库,后面章节里的建议和技术指导也很值得一看。
阅读本书的前提是,你已经有了一个较好的C++基础;虽然,关于多线程编程的知识或者经验不是必须的,不过这些经验可能有用。
如何使用这本书
如果从来没有写过多线程代码,我建议你从头到尾阅读本书;不过,可以跳过第5章中的较为细节的部分。第7章内容依赖于第5章中的内容,因此,如果跳过了第5章,应该保证在读第7章时,已经读过第5章。
如果没有用过C++11的工具,为了跟上这本书的进度,可以先阅读一下附录。新工具的使用在文本中已经标注出来,不过,当遇到一些没见过的工具时,可以随时回看附录。
即使有不同环境下写多线程代码的经验,开始的章节仍有必要浏览一下,这样就能清楚地知道,你所熟知的工具在新的C++标准中对应了哪些工具。如果使用原子变量去做一些底层工作,第5章必须阅读。第8章,有关C++多线程的异常和安全性的内容很值得一看。如果你对某些关键词比较感兴趣,索引和目录能够帮你快速找到相关的内容。
你可能喜欢回顾主要的章节,并用自己的方式阅读示例代码。虽然你已经了解C++线程库,但附录D还是很有用。例如,查找每个类和函数的细节。
代码公约和下载
为了区分普通文本,清单和正文中的中的所有代码都采用像这样的固定宽度的字体
。许多清单都伴随着代码注释,突出显示重要的概念。在某些情况下,你可以通过页下给出的快捷链接进行查阅。
本书所有实例的源代码,可在出版商的网站上进行下载:www.manning.com/cplusplusconcurrencyinaction。
软件需求
使用书中的代码,可能需要一个较新的C++编译器(要支持C++11语言的特性(见附录A)),还需要C++支持标准线程库。
写本书的时候,g++是唯一实现标准线程库的编译器(尽管Microsoft Visual Studio 2011 preview中也有实现)。g++4.3发布时添加了线程库,并且在随后的发布版本中进行扩展。g++4.3也支持部分C++11语言特性,更多特性的支持在后续发布版本中也有添加。更多细节请参考g++ C++11的状态页面[1]。
Microsoft Visual Studio 2010支持部分C++11特性,例如:右值引用和lambda函数,但是没有实现线程库。
我的公司Software Solutions Ltd,销售C++11标准线程库的完整实现,其可以使用在Microsoft Visual Studio 2005, Microsoft Visual Studio 2008, Microsoft Visual Studio 2010,以及各种g++版本上[2]。这个线程库也可以用来测试本书中的例子。
Boost线程库[3]提供的API,以及可移植到多个平台。本书中的大多数例子将std::
替换为boost::
,再#include
引用适当的头文件,就能使用Boost线程库来运行。还有部分工具还不支持(例如std::async
)或在Boost线程库中有着不同名字(例如:boost::unique_future
)。
作者在线
购买C++ Concurrency in Action就能访问曼宁(Manning Publications)的私人网络论坛,在那里可以对本书做一些评论,问一些技术问题,获得作者或其他读者的帮助。为了能够访问论坛和订阅它的内容,在浏览器地址中输入www.manning.com/CPlusPlusConcurrencyinAction后,页面将告诉你如何注册之后访问论坛,你能获得什么样的帮助,还有论坛中的一些规则。
曼宁保证为本书的读者提供互相交流,以及和作者交流的场所。虽然曼宁自愿维护本书的论坛,但不保证这样的场所不会收取任何的费用。所以,建议你可以尝试提一些有挑战性的问题给作者,免得这样的地方白白浪费。
在本书印刷时,就可以通过Internet访问作者的在线论坛和之前讨论的文字记录。
【1】GNU Compiler Collection C++0x/C++11 status page, http://gcc.gnu.org/projects/cxx0x.html.
【2】The just::thread
implementation of the C++ Standard Thread Library, http://www.stdthread.co.uk.
【3】The Boost C++ library collection, http://www.boost.org.