并发支持库 (自 C++11 起)
C++ 内建了对线程、原子操作、互斥、条件变量和期物的支持。
目录 |
[编辑] 线程
线程使程序能够在多个处理器核心上执行。
定义于头文件
<thread> | |
(C++11) |
管理一个独立的线程 (class) |
(C++20) |
支持自动加入和取消的 std::thread (class) |
管理当前线程的函数 | |
定义于命名空间
this_thread | |
(C++11) |
建议实现重新调度线程的执行 (function) |
(C++11) |
返回当前线程的线程 id (function) |
(C++11) |
停止当前线程的执行指定的时间段 (function) |
(C++11) |
停止当前线程的执行直到指定的时间点 (function) |
[编辑] 协作式取消 (自 C++20 起)
停止源、停止令牌 和 停止回调 组件可用于异步请求操作及时停止执行,通常是因为不再需要结果。这种请求称为停止请求。
这些组件指定了对停止状态的共享访问的语义。 任何对同一停止状态进行建模的组件对象分别是关联的停止源、停止令牌或停止回调。
概念 |
(自 C++26 起) |
它们被设计为
- 用于协作式取消执行,例如 std::jthread,
- 用于中断 std::condition_variable_any 等待函数,
|
(自 C++26 起) |
- 或用于自定义执行管理实现。
实际上,它们甚至不需要用于“停止”任何事物,而是可以用于线程安全的一次性函数调用触发器,例如。
定义于头文件
<stop_token> | |
停止令牌类型 | |
(C++20) |
用于查询是否已发出 std::jthread 取消请求的接口 (class) |
(C++26) |
提供停止令牌接口,其中停止永远不可能或不会被请求 (class) |
(C++26) |
引用其关联的 std::inplace_stop_source 对象的停止状态的停止令牌(class) |
停止源类型 | |
(C++20) |
表示停止一个或多个 std::jthread 的请求的类 (class) |
(C++26) |
作为停止状态的唯一所有者的 stoppable-source (class) |
停止回调类型 | |
(C++20) |
用于在 std::jthread 取消时注册回调的接口 (class template) |
(C++26) |
std::inplace_stop_token 的停止回调(class template) |
(C++26) |
获取给定停止令牌类型的回调类型 (alias template) |
概念 (自 C++20 起) | |
(C++26) |
指定停止令牌的基本接口,该接口允许查询停止请求以及停止请求是否可能 (concept) |
(C++26) |
指定不允许停止的停止令牌 (concept) |
(C++26) |
指定类型是关联的停止令牌的工厂,并且可以对其发出停止请求 (仅供演示的概念*) |
(C++26) |
指定用于使用给定的停止令牌类型注册回调的接口 (仅供演示的概念*) |
[编辑] 缓存大小访问 (自 C++17 起)
定义于头文件
<new> | |
避免伪共享的最小偏移量 促进真共享的最大偏移量 (常量) |
[编辑] 原子操作
这些组件为细粒度的原子操作提供支持,从而实现无锁并发编程。每个原子操作对于涉及同一对象的任何其他原子操作都是不可分的。原子对象是无数据竞争的。
定义于头文件
<atomic> | |
原子类型 | |
(C++11) |
atomic 类模板以及 bool、整型、浮点型、(自 C++20 起) 和指针类型的特化 (class template) |
(C++20) |
为非原子对象提供原子操作 (class template) |
原子类型上的操作 | |
(C++11) |
检查原子类型的操作是否为无锁的 (function template) |
(C++11)(C++11) |
原子地用非原子参数替换原子对象的值 (function template) |
(C++11)(C++11) |
原子地获取存储在原子对象中的值 (function template) |
(C++11)(C++11) |
原子地用非原子参数替换原子对象的值,并返回原子的旧值 (function template) |
原子地将原子对象的值与非原子参数进行比较,如果相等则执行原子交换,否则执行原子加载 (function template) | |
(C++11)(C++11) |
将非原子值添加到原子对象,并获取原子的先前值 (function template) |
(C++11)(C++11) |
从原子对象中减去非原子值,并获取原子的先前值 (function template) |
(C++11)(C++11) |
用按位与非原子参数的结果替换原子对象,并获取原子的先前值 (function template) |
(C++11)(C++11) |
用按位或非原子参数的结果替换原子对象,并获取原子的先前值 (function template) |
(C++11)(C++11) |
用按位异或非原子参数的结果替换原子对象,并获取原子的先前值 (function template) |
(C++26)(C++26) |
用与非原子参数的 std::max 结果替换原子对象,并获取原子的先前值 (function template) |
(C++26)(C++26) |
用与非原子参数的 std::min 结果替换原子对象,并获取原子的先前值 (function template) |
(C++20)(C++20) |
阻塞线程直到收到通知且原子值发生更改 (function template) |
(C++20) |
通知在 atomic_wait 中阻塞的线程 (function template) |
(C++20) |
通知在 atomic_wait 中阻塞的所有线程 (function template) |
标志类型和操作 | |
(C++11) |
无锁布尔原子类型 (class) |
原子地将标志设置为 true 并返回其先前值 (function) | |
(C++11)(C++11) |
原子地将标志的值设置为 false (function) |
(C++20)(C++20) |
原子地返回标志的值 (function) |
(C++20)(C++20) |
阻塞线程直到收到通知且标志发生更改 (function) |
(C++20) |
通知在 atomic_flag_wait 中阻塞的线程 (function) |
(C++20) |
通知在 atomic_flag_wait 中阻塞的所有线程 (function) |
初始化 | |
(C++11)(C++20 中已弃用) |
默认构造的原子对象的非原子初始化 (function template) |
(C++11)(C++20 中已弃用) |
静态存储持续时间的原子变量的常量初始化 (function macro) |
(C++11) |
将 std::atomic_flag 初始化为 false (macro constant) |
内存同步顺序 | |
(C++11) |
为给定的原子操作定义内存顺序约束 (enum) |
(C++11)(C++26 中已弃用) |
从 std::memory_order_consume 依赖树中移除指定的对象 (function template) |
(C++11) |
通用内存顺序相关的栅栏同步原语 (function) |
(C++11) |
线程与在同一线程中执行的信号处理程序之间的栅栏 (function) |
定义于头文件
<stdatomic.h> | |
C 兼容性宏 (自 C++23 起) | |
(C++23) |
兼容性宏,使得 _Atomic(T) 与 std::atomic<T> 相同 (function macro) |
_Atomic
宏和任何非宏全局命名空间声明均不由 <stdatomic.h>
以外的任何 C++ 标准库头文件提供。
[编辑] 互斥
互斥算法阻止多个线程同时访问共享资源。这可以防止数据竞争,并为线程之间的同步提供支持。
定义于头文件
<mutex> | |
(C++11) |
提供基本的互斥设施 (class) |
(C++11) |
提供互斥设施,该设施实现带超时的锁定 (class) |
(C++11) |
提供互斥设施,同一线程可以递归锁定该设施 (class) |
(C++11) |
提供可以递归锁定的互斥设施 由同一线程锁定,并实现带超时的锁定 (class) |
定义于头文件
<shared_mutex> | |
(C++17) |
提供共享互斥设施 (class) |
(C++14) |
提供共享互斥设施,并实现带超时的锁定 (class) |
通用互斥量管理 | |
定义于头文件
<mutex> | |
(C++11) |
实现严格的基于作用域的互斥量所有权包装器 (class template) |
(C++17) |
用于多个互斥量的避免死锁的 RAII 包装器 (class template) |
(C++11) |
实现可移动的互斥量所有权包装器 (class template) |
(C++14) |
实现可移动的共享互斥量所有权包装器 (class template) |
用于指定锁定策略的标签 (tag) | |
通用锁定算法 | |
(C++11) |
尝试通过重复调用 try_lock 来获取互斥量的所有权(function template) |
(C++11) |
锁定指定的互斥量,如果任何互斥量不可用则阻塞 (function template) |
调用一次 | |
(C++11) |
帮助对象,以确保 call_once 仅调用函数一次 (class) |
(C++11) |
即使从多个线程调用,也仅调用函数一次 (function template) |
[编辑] 条件变量
条件变量是一种同步原语,允许多个线程相互通信。它允许一些线程等待(可能带有超时)来自另一个线程的通知,以便它们可以继续执行。条件变量始终与互斥量相关联。
定义于头文件
<condition_variable> | |
(C++11) |
提供与 std::unique_lock 关联的条件变量 (class) |
(C++11) |
提供与任何锁类型关联的条件变量 (class) |
(C++11) |
计划在此线程完全完成时调用 notify_all (function) |
(C++11) |
列出条件变量上定时等待的可能结果 (enum) |
[编辑] 信号量 (C++20 起)
信号量是一种轻量级的同步原语,用于约束对共享资源的并发访问。当两者都适用时,信号量可能比条件变量更有效率。
定义于头文件
<semaphore> | |
(C++20) |
对非负资源计数建模的信号量 (类模板) |
(C++20) |
只有两种状态的信号量 (类型别名) |
[编辑] 闩锁和屏障 (C++20 起)
闩锁和屏障是线程协调机制,允许任意数量的线程阻塞,直到预期数量的线程到达。闩锁不能重复使用,而屏障可以重复使用。
定义于头文件
<latch> | |
(C++20) |
单次使用的线程屏障 (类) |
定义于头文件
<barrier> | |
(C++20) |
可重复使用的线程屏障 (类模板) |
[编辑] 期物
标准库提供了获取异步任务(即在单独线程中启动的函数)返回的值以及捕获其抛出的异常的工具。这些值在一个共享状态中进行传递,异步任务可以在其中写入其返回值或存储异常,而持有引用该共享状态的 std::future 或 std::shared_future 实例的其他线程可以检查、等待和以其他方式操作该共享状态。
定义于头文件
<future> | |
(C++11) |
存储一个值以供异步检索 (类模板) |
(C++11) |
封装一个函数以存储其返回值,供异步检索 (类模板) |
(C++11) |
等待异步设置的值 (类模板) |
(C++11) |
等待异步设置的值(可能被其他期物引用) (类模板) |
(C++11) |
异步运行一个函数(可能在新线程中),并返回一个将持有结果的 std::future (函数模板) |
(C++11) |
指定 std::async 的启动策略 (枚举) |
(C++11) |
指定对 std::future 和 std::shared_future 执行的定时等待的结果 (枚举) |
期物错误 | |
(C++11) |
报告与期物或承诺相关的错误 (类) |
(C++11) |
标识期物错误类别 (函数) |
(C++11) |
标识期物错误代码 (枚举) |
[编辑] 安全回收 (C++26 起)
安全回收技术最常用于直接解决访问-删除竞争。
读取-复制-更新机制 | |
定义于头文件
<rcu> | |
(C++26) |
允许对象受 RCU 保护 (类模板) |
(C++26) |
提供 RCU 保护区域 (类) |
(C++26) |
返回对 std::rcu_domain 类型的静态持续时间对象的引用(函数) |
(C++26) |
阻塞直到 RCU 域上的保护区域解锁 (函数) |
(C++26) |
可能评估 RCU 域上的计划操作,并阻塞直到所有先前的评估完成 (函数) |
(C++26) |
在 RCU 域上调度指定函数的评估,可能分配内存,并调用计划的评估 (函数模板) |
危害指针 | |
定义于头文件
<hazard_pointer> | |
(C++26) |
允许对象可进行危害保护 (类模板) |
(C++26) |
单写多读指针,在任何时间点最多只能由一个线程拥有 (类) |
(C++26) |
构造危害指针 (函数) |
[编辑] 参见
C 文档 关于 并发支持库
|