Concurrency support library (since C++11)
C++ 包含对线程、原子操作、互斥锁、条件变量和 future 的内置支持。
目录 |
线程
线程使得程序能够在多个处理器核心上执行。
|
定义于头文件
<thread>
|
|
|
(C++11)
|
管理独立线程
(类) |
|
(C++20)
|
std::thread
支持自动联结和取消操作
(类) |
管理当前线程的函数 |
|
|
定义于命名空间
this_thread
|
|
|
(C++11)
|
建议实现重新调度线程执行
(函数) |
|
(C++11)
|
返回当前线程的线程标识符
(函数) |
|
(C++11)
|
停止当前线程执行指定的时间长度
(函数) |
|
(C++11)
|
停止当前线程执行直到指定的时间点
(函数) |
协作式取消 (自 C++20 起)
组件 stop source 、 stop token 和 stop callback 可用于异步请求操作及时停止执行,通常是因为不再需要结果。此类请求被称为 stop request 。
这些组件规定了共享访问 stop state 的语义。任何模拟这些组件并引用相同停止状态的对象,分别是关联的停止源、停止令牌或停止回调。
|
概念
|
(始于 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)
|
作为停止状态唯一所有者的
可停止源
(类) |
停止回调类型 |
|
|
(C++20)
|
用于在
std::jthread
取消时注册回调的接口
(类模板) |
|
(C++26)
|
用于
std::inplace_stop_token
的停止回调
(类模板) |
|
(C++26)
|
获取给定停止令牌类型的回调类型
(别名模板) |
概念 (C++20 起) |
|
|
(C++26)
|
规定允许查询停止请求及停止请求是否可能的基本停止令牌接口
(概念) |
|
(C++26)
|
规定不允许停止的停止令牌
(概念) |
|
(C++26)
|
规定类型是关联停止令牌的工厂,并且可以对其发出停止请求
( 仅用于说明的概念* ) |
|
(C++26)
|
规定用于向给定停止令牌类型注册回调的接口
( 仅用于说明的概念* ) |
缓存大小访问 (since C++17)
|
定义于头文件
<new>
|
|
|
避免伪共享的最小偏移量
促进真共享的最大偏移量 (常量) |
|
原子操作
这些组件为细粒度原子操作提供支持,实现无锁并发编程。每个原子操作对于涉及同一对象的任何其他原子操作都具有不可分割性。原子对象是 无数据竞争的 。
|
定义于头文件
<atomic>
|
|
原子类型 |
|
|
(C++11)
|
原子类模板及其针对布尔型、整型、
浮点型
(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)
|
将原子对象替换为与非原子参数进行按位与操作的结果,并获取该原子对象的先前值
(函数模板) |
|
(C++11)
(C++11)
|
将原子对象替换为与非原子参数进行按位或操作的结果,并获取该原子对象的先前值
(函数模板) |
|
(C++11)
(C++11)
|
将原子对象替换为与非原子参数进行按位异或的结果,并获取该原子对象的先前值
(函数模板) |
|
(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)
|
无锁布尔原子类型
(类) |
|
(C++11)
(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 兼容性宏 (since 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)
|
仅有两种状态的信号量
(类型别名) |
闩锁与屏障 (始于 C++20)
门闩(latch)和屏障(barrier)是线程协调机制,允许任意数量的线程阻塞直至预期数量的线程到达。门闩不可重复使用,而屏障可重复使用。
|
定义于头文件
<latch>
|
|
|
(C++20)
|
单次使用的线程屏障
(类) |
|
定义于头文件
<barrier>
|
|
|
(C++20)
|
可重复使用的线程屏障
(类模板) |
Futures
标准库提供了获取异步任务(即在独立线程中启动的函数)返回值及捕获其所抛出异常的机制。这些值通过 共享状态 进行传递,异步任务可在其中写入返回值或存储异常,而持有 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
上执行的定时等待结果
(枚举) |
Future 错误 |
|
|
(C++11)
|
报告与 futures 或 promises 相关的错误
(类) |
|
(C++11)
|
标识 future 错误类别
(函数) |
|
(C++11)
|
标识 future 错误代码
(枚举) |
安全回收机制 (始于 C++26)
安全回收技术最常用于直接解决访问-删除竞争问题。
Read-Copy-Update 机制 |
|
|
定义于头文件
<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 文档
关于
并发支持库
|