◐ Shell
clean mode source ↗

并发支持库 (C++11 起) - cppreference.com

C++ 包含线程、原子操作、互斥、条件变量和 future 的内建支持。

线程

线程使得程序能在数个处理器核心同时执行。

在标头 <thread> 定义

(C++11)

管理单独的线程
(类) [编辑]

(C++20)

支持自动合并和取消的 std::thread
(类) [编辑]
管理当前线程的函数

在命名空间 this_thread 定义

(C++11)

建议实现重新调度各执行线程
(函数) [编辑]

(C++11)

返回当前线程的线程 id
(函数) [编辑]

(C++11)

使当前线程的执行停止指定的时间段
(函数) [编辑]
使当前线程的执行停止直到指定的时间点
(函数) [编辑]

协作式取消 (C++20 起)

停止源停止令牌 和停止回调 等组件可用于提出异步请求,使操作适时停止执行。通常这样做是由于不再需要其结果。这种请求被称为停止请求

这些组件指定了对于某个停止状态 的共享访问。实现这些组件的,指代相同停止状态的各个对象,分别为其关联停止源、停止令牌和停止回调。

它们的设计目标为:

  • 用于对诸如 std::jthread 进行协作式取消执行,
  • 中断 std::condition_variable_any 的等待函数,
  • 实施 execution::connect 创建的异步操作的停止完成,
(C++26 起)
  • 用于自定义的线程管理实现。

实际上它们甚至不需要用于“停止”任何操作,例如可以用作线程安全的一次性函数调用触发器。

在标头 <stop_token> 定义

停止令牌类型
用于查询是否已经做出 std::jthread 取消请求的接口
(类) [编辑]
提供一种停止令牌接口,它始终不可能停止或请求停止
(类) [编辑]
停止令牌,指代其关联的 std::inplace_stop_source 对象的停止状态
(类) [编辑]
停止源类型
表示请求停止一个或多个 std::jthread 的类
(类) [编辑]
一种作为停止状态唯一拥有者的 stoppable-source
(类) [编辑]
停止回调类型
用于在 std::jthread 取消上注册回调的接口
(类模板) [编辑]
用于 std::inplace_stop_token 的停止回调
(类模板) [编辑]
获得用于给定停止令牌类型的回调类型
(别名模板) [编辑]
概念 (C++26 起)
指定停止令牌的基本接口,其允许查询是否有停止请求及是否可能提出停止请求
(概念) [编辑]
指定一种不允许停止的停止令牌
(概念) [编辑]
指定某类型是关联停止令牌的工厂,并可于其上发出停止请求
(仅用于阐述的概念*) [编辑]
指定一种用于以给定停止令牌类型注册回调的接口
(仅用于阐述的概念*) [编辑]

缓存大小访问 (C++17 起)

原子操作

这些组件为细粒度的原子操作而提供,允许无锁并发编程。涉及同一对象的每个原子操作,相对于任何其他原子操作是不可分的。原子对象不存在数据竞争

在标头 <atomic> 定义

原子类型

(C++11)

atomic 类模板及其针对布尔、整数、浮点数(C++20 起)和指针类型的特化
(类模板) [编辑]
提供非原子对象上的原子操作
(类模板) [编辑]
原子类型上的操作
检查该原子类型的操作是否是免锁的
(函数模板) [编辑]
原子地以非原子实参替换原子对象的值
(函数模板) [编辑]
原子地获得存储于原子对象的值
(函数模板) [编辑]
原子地以非原子实参的值替换原子对象的值,并返回该原子对象的旧值
(函数模板) [编辑]
原子地比较原子对象和非原子实参的值,相等时进行原子交换,不相等时进行原子加载
(函数模板) [编辑]
将非原子值加到原子对象上,并获得原子对象的先前值
(函数模板) [编辑]
从原子对象中减去非原子值,并获得原子对象的先前值
(函数模板) [编辑]
将原子对象替换为与非原子实参逐位与的结果,并获得原子对象的先前值
(函数模板) [编辑]
将原子对象替换为与非原子实参逐位或的结果,并获得原子对象的先前值
(函数模板) [编辑]
将原子对象替换为与非原子实参逐位异或的结果,并获得原子对象的先前值
(函数模板) [编辑]
将原子对象替换为与非原子实参的 std::max 的结果,并获得原子对象的先前值
(函数模板) [编辑]
将原子对象替换为与非原子实参的 std::min 的结果,并获得原子对象的先前值
(函数模板) [编辑]
阻塞线程直至被提醒且原子值更改
(函数模板) [编辑]
提醒一个在 atomic_wait 中阻塞的线程
(函数模板) [编辑]
提醒所有在 atomic_wait 中阻塞的线程
(函数模板) [编辑]
标志类型及操作
免锁的布尔原子类型
(类) [编辑]
原子地设置标志为 true 并返回其先前值
(函数) [编辑]
原子地设置标志值为 false
(函数) [编辑]
原子地返回标志的值
(函数) [编辑]
阻塞线程,直至被提醒且标志更改
(函数) [编辑]
提醒一个在 atomic_flag_wait 中阻塞的线程
(函数) [编辑]
提醒所有在 atomic_flag_wait 中阻塞的线程
(函数) [编辑]
初始化

(C++11)(C++20 弃用)

对默认构造的原子对象进行非原子初始化
(函数模板) [编辑]

(C++11)(C++20 弃用)

静态存储期的原子变量的常量初始化
(宏函数) [编辑]
初始化 std::atomic_flagfalse
(宏常量) [编辑]
内存同步定序
为给定的原子操作定义内存定序约束
(枚举) [编辑]

(C++11)(C++26 弃用)

std::memory_order_consume 依赖树移除指定对象
(函数模板) [编辑]
通用的依赖内存定序的栅栏同步原语
(函数) [编辑]
线程与执行于同一线程的信号处理函数间的栅栏
(函数) [编辑]

在标头 <stdatomic.h> 定义

C 兼容宏 (C++23 起)

(C++23)

使得 _Atomic(T) 等同于 std::atomic<T> 的兼容性宏
(宏函数) [编辑]

<stdatomic.h> 以外的 C++ 标准库标头不提供 _Atomic 宏或任何非宏的全局命名空间声明。

互斥

互斥算法避免多个线程同时访问共享资源。这会避免数据竞争,并提供线程间的同步支持。

在标头 <mutex> 定义

(C++11)

提供基本互斥设施
(类) [编辑]
提供互斥设施,实现有时限锁定
(类) [编辑]
提供能被同一线程递归锁定的互斥设施
(类) [编辑]
提供能被同一线程递归锁定的互斥设施,并实现有时限锁定
(类) [编辑]

在标头 <shared_mutex> 定义

提供共享互斥设施
(类) [编辑]
提供共享互斥设施并实现有时限锁定
(类) [编辑]
通用互斥体管理

在标头 <mutex> 定义

实现严格基于作用域的互斥体所有权包装器
(类模板) [编辑]
用于多个互斥体的免死锁 RAII 封装器
(类模板) [编辑]
实现可移动的互斥体所有权包装器
(类模板) [编辑]
实现可移动的共享互斥体所有权封装器
(类模板) [编辑]
用于指定锁定策略的标签
(标签) [编辑]
通用锁定算法

(C++11)

尝试通过重复调用 try_lock 获得互斥体的所有权
(函数模板) [编辑]

(C++11)

锁定指定的互斥体,若任何一个不可用则阻塞
(函数模板) [编辑]
单次调用

(C++11)

确保 call_once 只调用函数一次的帮助对象
(类) [编辑]

(C++11)

仅调用函数一次,即使从多个线程调用
(函数模板) [编辑]

条件变量

条件变量是允许多个线程相互交流的同步原语。它允许一定量的线程等待(可以定时)另一线程的提醒,然后再继续。条件变量始终关联到一个互斥体。

信号量 (C++20 起)

信号量 (semaphore) 是一种轻量的同步原语,用于制约对共享资源的并发访问。在可以使用两者时,信号量能比条件变量更有效率。

闩与屏障 (C++20 起)

闩 (latch) 与屏障 (barrier) 是线程协调机制,允许任何数量的线程阻塞直至期待数量的线程到达。闩不能重复使用,而屏障则可以。

未来体

标准库提供了一些工具来获取异步任务(即在单独的线程中启动的函数)的返回值,并捕捉其所抛出的异常。这些值在共享状态中传递,其中异步任务可以写入其返回值或存储异常,而且可以由持有该引用该共享态的 std::futurestd::shared_future 实例的线程检验、等待或是操作这个状态。

在标头 <future> 定义

(C++11)

存储一个值以进行异步获取
(类模板) [编辑]
打包一个函数,存储其返回值以进行异步获取
(类模板) [编辑]

(C++11)

等待被异步设置的值
(类模板) [编辑]
等待一个被异步设置的值(可能被其他未来体引用)
(类模板) [编辑]

(C++11)

异步运行一个函数(有可能在新线程中执行),并返回将保有它的结果的 std::future
(函数模板) [编辑]

(C++11)

指定 std::async 所用的启动策略
(枚举) [编辑]
指定在 std::futurestd::shared_future 上的定时等待的结果
(枚举) [编辑]
未来体错误
报告与未来体或承诺体有关的错误
(类) [编辑]
鉴别未来体错误类别
(函数) [编辑]
鉴别未来体错误码
(枚举) [编辑]

安全回收 (C++26 起)

安全回收技术最常用于直接解决访问-删除竞争。

读-复制-更新机制

在标头 <rcu> 定义

允许一个对象被 RCU 保护
(类模板) [编辑]
提供受 RCU 保护的域
(类) [编辑]
返回一个 std::rcu_domain 类型的静态储存期对象的引用
(函数) [编辑]
阻塞直到一个 RCU 域上的保护区域解锁
(函数) [编辑]
可能执行一个 RCU 域上的计划操作,并且阻塞直到所有之前的操作完成
(函数) [编辑]
在一个 RCU 域上安排一个指定函数执行,可能分配内存,并按计划调用
(函数模板) [编辑]
风险指针

在标头 <hazard_pointer> 定义

允许一个对象具有风险保护的能力
(类模板) [编辑]
在任何时刻都只能被一个线程持有的单写多读指针
(类) [编辑]
构造一个风险指针
(函数) [编辑]

参阅