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)
             
            
           
           | 停止当前线程执行直至指定的时间点 (函数) | 
协作式取消 (since C++20)
组件 stop source 、 stop token 和 stop callback 可用于异步请求操作及时停止执行,通常是因为不再需要结果。此类请求称为 stop request 。
这些组件规定了共享访问 停止状态 的语义。任何模拟这些组件并引用相同停止状态的对象,分别对应关联的停止源、停止令牌或停止回调。
| 
          概念
          
            | (始于 C++26) | 
它们的设计目标:
- 用于协作式取消执行,例如对于 std::jthread ,
- 用于中断 std::condition_variable_any 等待函数,
| 
 | (since 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)
             
            
           
           | 规定用于向给定停止令牌类型注册回调的接口 ( 仅用于说明的概念* ) | 
缓存大小访问 (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)
             
            
            
             <span class="t-mark-rev t-since-cxx
            
           
           | |
       除了
       
        
         <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)
             
            
           
           | 仅具有两种状态的信号量 (类型别名) | 
闩锁与屏障 (since 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 错误代码 (枚举) | 
安全回收 (since 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 文档
           
          
          关于
          
           
            并发支持库
           
          
          |