Skip to content

Latest commit

 

History

History
115 lines (69 loc) · 8.22 KB

File metadata and controls

115 lines (69 loc) · 8.22 KB

零、前言

多线程应用在单处理器环境中执行多个线程,以实现。这本书充满了实际的例子,将帮助你成为用 C++ 编写健壮的并发和并行应用的大师。在本书中,您将深入研究多线程和并发的基础,并了解如何实现它们。在此过程中,您将探索原子操作来优化代码性能,并将并发性应用于分布式计算和 GPU 处理。

这本书涵盖了什么

第 1 章重访多线程,总结了 C++ 中的多线程,重访了所有你应该已经熟悉的概念,并通过一个使用 c++ 2011 修订版中添加的本机线程支持的多线程基本示例。

第 2 章处理器和操作系统上的多线程实现建立在上一章讨论的硬件实现所提供的基础之上,展示了操作系统是如何利用这些功能并使其对应用可用的。它还讨论了如何允许进程和线程使用内存和处理器,以防止应用和线程相互干扰。

第 3 章C++ 多线程应用编程接口,探讨了作为操作系统级应用编程接口(例如 Win32 和 POSIX)或由框架(例如 Boost、Qt 和 POCO)提供的各种多线程应用编程接口。它简要介绍了每个应用编程接口,列出了与其他应用编程接口相比的不同之处,以及它对您的应用的优缺点。

第 4 章线程同步和通信采用了前几章中学习的主题,并探索了一种使用 C++ 14 的本机线程 API 实现的高级多线程实现,该 API 允许多个线程在没有任何线程安全问题的情况下进行通信。它还涵盖了许多类型的同步机制之间的差异,包括互斥、锁和条件变量。

第 5 章原生 C++ 线程和原语,包括线程、并发、本地存储以及该 API 支持的线程安全。在前一章的示例基础上,讨论并探索了如何使用 C++ 11 和 C++ 14 中的完整功能集提供的功能来扩展和优化线程安全性。

第 6 章调试多线程代码,教你如何使用 Valgrind (Memcheck、DRD、Helgrind 等)等工具分析应用的多线程性能,发现热点,解决或防止并发访问带来的问题。

第 7 章、*最佳实践、*涵盖了常见的陷阱和陷阱,以及如何在它们回来困扰你之前发现它们。它还通过示例探索了许多常见和不太常见的场景。

第 8 章原子操作–与硬件一起工作,详细介绍了原子操作:它们是什么以及如何最好地使用它们。编译器支持是跨 CPU 体系结构来考虑的,并且会评估何时值得在代码中投入时间来实现原子操作。它还研究了这种优化如何限制代码的可移植性。

第 9 章分布式计算多线程,吸取了前面章节中的许多经验教训,并将其应用于多系统、集群级别的规模。使用一个基于 OpenMPI 的例子,它展示了多线程是如何跨多个系统完成的,例如计算机集群中的节点。

第 10 章GPU 多线程,展示了 GPU 应用中多线程的使用(例如 CUDA 和 OpenCL)。使用基于 OpenCL 的示例,探索了一个可以并行执行任务的基本多线程应用。本章吸取了前几章中的经验教训,并将其应用于显卡和衍生硬件(例如,机架式矢量处理器硬件)上的处理。

这本书你需要什么

要遵循本书中的说明,您需要在系统上安装任何操作系统(Windows、Linux 或 macOS)和任何 C++ 编译器。

这本书是给谁的

这本书是为希望扩展多线程和并发处理知识的中级 C++ 开发人员编写的。您应该对多线程有基本的经验,并且能够在命令行上使用 C++ 开发工具链。

约定

在这本书里,你会发现许多区分不同种类信息的文本样式。以下是这些风格的一些例子和对它们的意义的解释。

文本中的码字、数据库表名、文件夹名、文件名、文件扩展名、路径名、伪 URL、用户输入和 Twitter 句柄如下所示:randGen()方法采用两个参数,定义返回值的范围

代码块设置如下:

cout_mtx.lock();
 cout << "Thread " << tid << " adding " << rval << ". New value: " << val << ".\n";
 cout_mtx.unlock();

 values_mtx.lock();
 values.push_back(val);
 values_mtx.unlock();
}

当我们希望将您的注意力吸引到代码块的特定部分时,相关的行或项目以粗体显示:

cout_mtx.lock();
 cout << "Thread " << tid << " adding " << rval << ". New value: " << val << ".\n";
 cout_mtx.unlock();

 values_mtx.lock();
 values.push_back(val);
 values_mtx.unlock();
}

任何命令行输入或输出都编写如下:

$ make
g++ -o ch01_mt_example -std=c++ 11 ch01_mt_example.cpp

新术语和重要词汇以粗体显示。您在屏幕上看到的单词(例如,菜单或对话框中的单词)会出现在文本中。

Warnings or important notes appear like this. Tips and tricks appear like this.

读者反馈

我们随时欢迎读者的反馈。让我们知道你对这本书的看法——你喜欢或不喜欢什么。读者反馈对我们来说很重要,因为它有助于我们开发出你真正能从中获益的标题。要给我们发送一般反馈,只需发送电子邮件feedback@packtpub.com,并在您的邮件主题中提及书名。如果您对某个主题有专业知识,并且对写作或投稿感兴趣,请参见我们位于www.packtpub.com/authors的作者指南。

下载示例代码

你可以从你在http://www.packtpub.com的账户下载这本书的示例代码文件。如果您在其他地方购买了这本书,您可以访问http://www.packtpub.com/support并注册,以便将文件直接通过电子邮件发送给您。您可以按照以下步骤下载代码文件:

  1. 使用您的电子邮件地址和密码登录或注册我们的网站。
  2. 将鼠标指针悬停在顶部的“支持”选项卡上。
  3. 点击代码下载和勘误表。
  4. 在搜索框中输入图书的名称。
  5. 选择要下载代码文件的书籍。
  6. 从您购买这本书的下拉菜单中选择。
  7. 点击代码下载。

下载文件后,请确保使用最新版本的解压缩文件夹:

  • 视窗系统的 WinRAR / 7-Zip
  • zipeg/izp/un ARX for MAC
  • 适用于 Linux 的 7-Zip / PeaZip

这本书的代码包也托管在 GitHub 上https://GitHub . com/PacktPublishing/Mastering-CPP-多线程。我们还有来自丰富的图书和视频目录的其他代码包,可在https://github.com/PacktPublishing/获得。看看他们!

正误表

尽管我们尽了最大努力来确保我们内容的准确性,但错误还是会发生。如果你在我们的某本书里发现一个错误,也许是文本或代码中的错误,如果你能向我们报告,我们将不胜感激。通过这样做,你可以让其他读者免受挫折,并帮助我们改进这本书的后续版本。如果您发现任何勘误表,请访问http://www.packtpub.com/submit-errata,选择您的书籍,点击勘误表提交表格链接,并输入您的勘误表的详细信息。一旦您的勘误表得到验证,您的提交将被接受,勘误表将上传到我们的网站或添加到该标题勘误表部分下的任何现有勘误表列表中。要查看之前提交的勘误表,请前往https://www.packtpub.com/books/content/support并在搜索栏中输入图书名称。所需信息将出现在勘误表部分。

海盗行为

互联网上版权材料的盗版是所有媒体的一个持续问题。在 Packt,我们非常重视版权和许可证的保护。如果您在互联网上遇到任何形式的我们作品的非法拷贝,请立即向我们提供位置地址或网站名称,以便我们寻求补救。请通过copyright@packtpub.com联系我们,获取疑似盗版资料的链接。我们感谢您在保护我们的作者方面的帮助,以及我们为您带来有价值内容的能力。

问题

如果您对本书的任何方面有问题,可以在questions@packtpub.com联系我们,我们将尽最大努力解决问题。