并发支持库 (自 C++11 起)
来自 cppreference.com
< cpp
C++ 包含对线程、原子操作、互斥、条件变量和期货的内置支持。
内容 |
[编辑] 线程
线程使程序能够跨多个处理器核心执行。
在头文件
<thread> 中定义 | |
(C++11) |
管理一个单独的线程 (类) |
(C++20) |
std::thread,支持自动连接和取消 (类) |
管理当前线程的函数 | |
在命名空间
this_thread 中定义 | |
(C++11) |
建议实现重新安排线程的执行 (函数) |
(C++11) |
返回当前线程的线程 ID (函数) |
(C++11) |
停止当前线程的执行,持续指定时间 (函数) |
(C++11) |
停止当前线程的执行,直到指定时间点 (函数) |
协作式取消
|
(自 C++20 起) |
[编辑] 缓存大小访问
在头文件
<new> 中定义 | |
最小偏移量,以避免错误共享 最大偏移量,以促进真实共享 (常量) |
[编辑] 原子操作
这些组件用于提供细粒度的原子操作,允许无锁并发编程。每个原子操作对于涉及相同对象的任何其他原子操作都是不可分割的。原子对象没有数据竞争。
|
(自 C++23 起) |
定义在头文件
<atomic> 中 | |
原子类型 | |
(C++11) |
原子类模板和针对 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) |
用与非原子参数进行按位与运算的结果替换原子对象,并获取原子的先前值 (函数模板) |
(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) |
无锁布尔原子类型 (类) |
原子地将标志设置为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) |
从std::memory_order_consume依赖树中移除指定的物体 (函数模板) |
(C++11) |
通用的内存顺序依赖的栅栏同步原语 (函数) |
(C++11) |
线程与在同一线程中执行的信号处理程序之间的栅栏 (函数) |
定义在头文件
<stdatomic.h> 中 | |
C 兼容宏 | |
(C++23) |
兼容宏,使得_Atomic(T)与std::atomic<T>相同 (函数宏) |
[edit] 互斥
互斥算法防止多个线程同时访问共享资源。这可以防止数据竞争并为线程之间的同步提供支持。
定义在头文件
<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 起) |
[编辑] 期货
标准库提供了用于获取返回的值和捕获异步任务(即在单独的线程中启动的函数)抛出的异常的设施。这些值在共享状态中进行通信,异步任务可以在其中写入其返回值或存储异常,并且可以由持有引用该共享状态的 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 起) |
[编辑] 参见
C 文档 针对 并发支持库
|