导入
C++11 和 C++14:基础
本课程演示了 C++11 和 C++14 中并发编程的基础知识和总体概览。

timeline.png
随着 C++11 标准的发布,C++ 引入了多线程库和内存模型。该库提供了原子变量、线程、锁和条件变量等基本构建模块,这些构成了后续 C++ 标准(如 C++17 和 C++20)建立更高抽象的基础。然而,C++11 本身已经具备任务(task)机制,其抽象层次高于前述的基本构建模块。
大致来说,可以将 C++ 的并发发展划分为三个演进阶段。
## C++11 和 C++14:基础阶段 多线程功能在 C++11 中首次引入。这一支持包含两个部分:一个**明确定义**的内存模型,以及一个标准化的线程接口。C++14 在多线程设施中增加了读写锁。内存模型
多线程的基础是一个明确定义的内存模型。该模型需要处理以下几个方面:
- 原子操作:能够不被中断地执行的操作。
- 操作的部分顺序:某些操作必须保持特定顺序,不能被重排。
- 操作的可见性:对共享变量的操作在其他线程中何时可见的保证。
C++ 的内存模型受到其前身——Java 内存模型的启发。但与 Java 不同的是,C++ 允许我们打破顺序一致性(sequential consistency)的约束,而顺序一致性正是原子操作的默认行为。顺序一致性提供两个保证:
- 程序中的指令按源代码顺序执行。
- 所有线程的所有操作存在全局顺序。
内存模型基于原子数据类型上的原子操作(简称“原子”)。
## 原子操作 C++ 提供了一组简单的原子数据类型:布尔值、字符、数值以及多种变体的指针。你可以使用类模板 `std::atomic` 自定义原子数据类型。原子操作建立了同步和顺序约束,这些约束也可以适用于非原子类型。标准化的线程接口是 C++ 并发机制的核心。