简介
让我们来看看本章将要介绍的一些重要概念!
本章内容概要
并发与并行是现代编程语言的核心特性。在 C++11 之前,语言本身并未提供对线程的标准支持——开发者只能依赖第三方库或系统 API。现代 C++ 逐步引入了越来越多必需的功能:线程、原子操作、锁机制、std::async 以及未来(futures)。
C++17 为我们提供了并行化大多数标准库算法的能力。通过一个强大且简洁的抽象层,你可以充分利用机器的计算能力。
在本章中,你将学习:
- C++ 在并行与并发方面的发展方向
- 为什么
std::thread不足以满足所有需求 - 执行策略(execution policies)是什么
- 如何运行并行算法
- 哪些算法已被并行化
- 新增的并行算法有哪些
- 并行执行的预期性能表现
- 并行执行的示例与基准测试
观察我们周围的计算机设备可以发现,绝大多数都是多处理器架构。即使是智能手机也普遍拥有四核甚至八核处理器。更不用说显卡,它们配备了数百甚至上千个小型计算核心。
这一向多核架构发展的趋势,在 Herb Sutter 的著名文章《免费午餐已结束:软件中的并发根本转变》中得到了精辟总结。该文发表于 2006 年。
只需环顾四周,就能清楚地看到这一趋势仍在持续加速。
虽然对于简单的应用程序来说,可能并不需要完全利用机器的计算能力,但许多应用恰恰需要这种性能:游戏开发、快速响应的应用程序、图形处理、音视频编辑、数据处理、金融系统、服务器等。在 CPU 上创建线程并实现任务的并发处理,正是实现高性能的一种有效方式。
从 C++11/14 开始,我们终于在标准库中拥有了原生的线程支持。现在你可以直接创建 std::thread 实例,而不再依赖第三方库或系统接口。此外,还支持异步处理与未来(futures),即 std::async。
多线程是现代 C++ 中极为重要的组成部分。在 C++ 标准委员会中,专门设有“SG1, 并发”小组,致力于将更多类似功能引入标准。
未来的方向包括:
- 协程(Coroutines)
- 原子智能指针(Atomic Smart Pointers)
- 事务内存(Transactional Memory)
- 屏障(Barriers)
- 任务块(Task Blocks)
- 并行计算(Parallelism)
- 计算(Compute)
- 执行器(Executors)
- 对异构编程模型的支持
由此可见,目标是尽可能充分地暴露机器的计算潜能,并直接通过标准库进行调用。
让我们开始吧。