併發支援庫 (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 文件 關於 併發支援庫
|