並行支援函式庫 (自 C++11 起)
C++ 內建支援執行緒、原子操作、互斥、條件變數以及未來值 (future)。
目錄 |
[edit] 執行緒
執行緒使程式能夠在多個處理器核心上執行。
| 定義於標頭檔
<thread> | |
| (C++11) |
管理一個獨立的執行緒 (類別) |
| (C++20) |
std::thread 支援自動連接 (auto-joining) 與取消 (類別) |
管理目前執行緒的函式 | |
| 定義於命名空間
this_thread | |
| (C++11) |
建議實作重新排程執行緒的執行 (函式) |
| (C++11) |
回傳目前執行緒的執行緒 ID (函式) |
| (C++11) |
停止目前執行緒的執行,持續指定的時間長度 (函式) |
| (C++11) |
停止目前執行緒的執行,直到指定的時間點 (函式) |
[edit] 協同取消 (自 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) |
一個 stoppable-source,是停止狀態的唯一擁有者(類別) |
停止回呼類型 | |
| (C++20) |
一個介面,用於在 std::jthread 取消時註冊回呼函式 (類別模板) |
| (C++26) |
一個 std::inplace_stop_token 的停止回呼(類別模板) |
| (C++26) |
取得給定停止權杖類型的回呼類型 (別名模板) |
概念 (Concept) (自 C++20 起) | |
| (C++26) |
指定停止權杖的基本介面,允許查詢停止請求以及停止請求是否可能 (概念) |
| (C++26) |
指定一個不允許停止的停止權杖 (概念) |
| (C++26) |
指定某類型是相關聯停止權杖的工廠,並且可以對其發出停止請求 (僅供闡釋的概念*) |
| (C++26) |
指定一個介面,用於向給定停止權杖類型註冊回呼函式 (僅供闡釋的概念*) |
[edit] 快取大小存取 (自 C++17 起)
| 定義於標頭檔
<new> | |
| 避免偽共享的最小偏移量 促進真共享的最大偏移量 (常數) | |
[edit] 原子操作
這些元件用於精細粒度的原子操作,允許無鎖並行程式設計。每個原子操作對於涉及相同物件的任何其他原子操作而言都是不可分割的。原子物件無資料競爭 (data race)。
| 定義於標頭檔
<atomic> | |
原子型別 | |
| (C++11) |
atomic 類別範本及其針對 bool、整數、 浮點數、(自 C++20 起)及指標型別的特化 (類別範本) |
| (C++20) |
在非原子物件上提供原子操作 (類別模板) |
原子類型上的操作 | |
| (C++11) |
檢查原子型別的操作是否為無鎖 (lock-free) (函式範本) |
| (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) |
通用記憶體順序相依的屏障 (fence) 同步原語 (函式) |
| (C++11) |
同一執行緒中執行緒與訊號處理常式之間的屏障 (fence) (函式) |
| 定義於標頭檔
<stdatomic.h> | |
C 語言相容巨集 (自 C++23 起) | |
| (C++23) |
相容巨集,使得 _Atomic(T) 等同於 std::atomic<T> (函式巨集) |
除了 <stdatomic.h> 之外,沒有其他 C++ 標準函式庫標頭檔提供 _Atomic 巨集,或任何非巨集的全域命名空間宣告。
[edit] 互斥
互斥演算法可防止多個執行緒同時存取共享資源。這可防止資料競爭 (data race) 並提供執行緒間的同步支援。
| 定義於標頭檔
<mutex> | |
| (C++11) |
提供基本的互斥功能 (類別) |
| (C++11) |
提供實作帶有逾時鎖定 (locking with a timeout) 的互斥功能 (類別) |
| (C++11) |
提供可由同一個執行緒遞迴鎖定的互斥功能 (類別) |
| (C++11) |
提供可遞迴鎖定的互斥功能 由同一個執行緒進行,並實作帶有逾時的鎖定 (類別) |
| 定義於標頭檔
<shared_mutex> | |
| (C++17) |
提供共享互斥功能 (類別) |
| (C++14) |
提供共享互斥功能並實作帶有逾時的鎖定 (類別) |
通用互斥體管理 | |
| 定義於標頭檔
<mutex> | |
| (C++11) |
實作嚴格基於作用域的互斥體所有權包裝器 (類別模板) |
| (C++17) |
用於多個互斥體的避免死鎖 (deadlock) 的 RAII 包裝器 (類別模板) |
| (C++11) |
實作可移動的互斥體所有權包裝器 (類別模板) |
| (C++14) |
實作可移動的共享互斥體所有權包裝器 (類別模板) |
| 用於指定鎖定策略的標籤 (標籤) | |
通用鎖定演算法 | |
| (C++11) |
透過重複呼叫 try_lock 嘗試取得互斥體的所有權(函式模板) |
| (C++11) |
鎖定指定的互斥體,如果任何互斥體不可用則阻塞 (函式模板) |
僅呼叫一次 | |
| (C++11) |
輔助物件,確保 call_once 僅呼叫該函式一次 (類別) |
| (C++11) |
即使從多個執行緒呼叫,也只呼叫函式一次 (函式模板) |
[edit] 條件變數
條件變數是一種同步原語 (synchronization primitive),允許多個執行緒彼此通訊。它允許一定數量的執行緒等待 (可能帶有逾時) 來自其他執行緒的通知,以指示它們可以繼續執行。條件變數總是與互斥體相關聯。
| 定義於標頭檔
<condition_variable> | |
| (C++11) |
提供與 std::unique_lock 相關聯的條件變數 (類別) |
| (C++11) |
提供與任何鎖定類型相關聯的條件變數 (類別) |
| (C++11) |
排程在目前執行緒完全結束時呼叫 notify_all(函式) |
| (C++11) |
列出條件變數上逾時等待的可能結果 (列舉) |
[edit] 號誌 (Semaphore) (自 C++20 起)
號誌是一種輕量級的同步原語 (synchronization primitive),用於限制對共享資源的並行存取。當兩者皆可用時,號誌可能比條件變數更有效率。
| 定義於標頭檔
<semaphore> | |
| (C++20) |
模擬非負資源計數的號誌 (類別模板) |
| (C++20) |
只有兩種狀態的號誌 (類型別名) |
[edit] 閂鎖 (Latch) 與屏障 (Barrier) (自 C++20 起)
閂鎖和屏障是執行緒協調機制,允許多個執行緒阻塞,直到預期數量的執行緒到達為止。閂鎖不能重複使用,而屏障可以重複使用。
| 定義於標頭檔
<latch> | |
| (C++20) |
單次使用的執行緒屏障 (類別) |
| 定義於標頭檔
<barrier> | |
| (C++20) |
可重複使用的執行緒屏障 (類別模板) |
[edit] 未來值 (Future)
標準函式庫提供功能,用於取得非同步任務 (即在獨立執行緒中啟動的函式) 回傳的值並捕獲它們拋出的例外。這些值在 共享狀態 (shared state) 中進行通訊,其中非同步任務可以寫入其回傳值或儲存例外,並且可以由持有引用該共享狀態的 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) |
報告與未來值 (future) 或期約 (promise) 相關的錯誤 (類別) |
| (C++11) |
識別未來值錯誤類別 (函式) |
| (C++11) |
識別未來值錯誤碼 (列舉) |
[edit] 安全回收 (自 C++26 起)
安全回收技術最常直接用於解決存取-刪除競爭 (access-deletion races)。
讀取-複製-更新機制 | |
| 定義於標頭檔
<rcu> | |
| (C++26) |
允許物件受 RCU 保護 (類別模板) |
| (C++26) |
提供 RCU 保護區域 (類別) |
| (C++26) |
回傳類型為 std::rcu_domain 的靜態存續期物件的引用(函式) |
| (C++26) |
阻塞直到 RCU 域上的保護區域解鎖 (函式) |
| (C++26) |
可能會評估 RCU 域上排程的操作,並阻塞直到所有前續評估完成 (函式) |
| (C++26) |
在 RCU 域上排程指定函式的評估,可能分配記憶體並呼叫排程的評估 (函式模板) |
風險指標 (Hazard Pointers) | |
| 定義於標頭檔
<hazard_pointer> | |
| (C++26) |
允許物件可被危險保護 (類別模板) |
| (C++26) |
單寫多讀指標,在任何時間點最多只能由一個執行緒擁有 (類別) |
| (C++26) |
建構一個危險指標 (函式) |
[edit] 參閱
| C 語言文件 關於 並行支援函式庫
|