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