执行控制库 (C++26 起)
出自cppreference.com
< cpp
執行控制庫提供了用於在通用執行資源上管理異步執行的框架。
該庫的目標是提供針對異步操作的基本術語類型,並允許以簡便和可組合的方式構建任務執行圖。
庫範圍的定義
- 發送器:對要發送去執行的工作的描述。產生操作狀態(見下文)。
- 發送器將它們的結果異步「發送」給稱為「接收器」(見下文)的監聽者。
- 可以用通用算法把發送器組合成任務圖。
- 發送器工廠/適配器是捕捉了滿足 sender 概念的對象中的常見異步模式的通用算法。
- 接收器:泛化的回調,它消耗或「接受」由發送器產生的異步結果。
- 接收器包含三個不同「通道」,發送器可以通過它們傳播成功、失敗和取消的結果,分別稱為「值」、「錯誤」和「停止」通道。
- 接收器提供可擴展的執行環境:可以由消耗方用來參數化異步操作的一組鍵/值對。
- 操作狀態:包含異步操作所需狀態的對象。
- 當發送器和接收器被傳遞給 std::execution::connect 時,就被連接起來。
- 將發送器和接收器連接起來的結果就是一個操作狀態。
- 當在操作狀態上調用「
start」後,其工作才會加入隊列執行。 - 一旦啟動,則操作狀態的生存期在異步操作完成前都不會結束,且其地址必須穩定。
- 調度器:對執行上下文的輕量級句柄。
- 執行上下文是諸如線程池或 GPU 流這樣的異步執行源。
- 調度器是工廠或發送器,它在執行上下文所擁有的某個執行線程中完成其接收器。
庫工具
概念
調度器
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
指定類型為調度器 (概念) |
發送器
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
指定類型為發送器 (概念) |
(C++26) |
指定發送器可以為給定關聯環境類型創建異步操作 (概念) |
接收器
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
指定類型為接收器 (概念) |
操作狀態
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
指定類型為操作狀態 (概念) |
工具組件
執行上下文
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
保有一個線程安全 MPSC 任務隊列和一個手動驅動時間循環的執行資源 (類) |
執行域
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
默認執行域標籤類型,用於派發源於發送器標籤的變換 (類) |
(C++26) |
變換為給定執行域標籤下的新發送器 (函數模板) |
(C++26) |
在給定執行域標籤下使用給定發送器消耗器標籤和一組實參來消耗一個發送器並返回其結果 (函數模板) |
向前進展保證
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
| 指定由調度器的關聯執行資源所創建的執行代理的向前進展保證 (枚舉) | |
環境
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
以查詢對象和值構建可查詢對象 (類模板) |
(C++26) |
聚合多個可查詢對象為一個可查詢對象 (類模板) |
(C++26) |
返回給定實參的關聯可查詢對象 (定製點對象) |
查詢
在標頭
<execution> 定義 | |
(C++26) |
詢問查詢對象是否應當通過可查詢適配器予以轉發 (定製點對象) |
(C++26) |
詢問可查詢對象的關聯分配器 (定製點對象) |
(C++26) |
詢問可查詢對象的關聯停止令牌 (定製點對象) |
(C++26) |
詢問可查詢對象的關聯執行域標籤 (定製點對象) |
(C++26) |
詢問可查詢對象的關聯調度器 (定製點對象) |
| 詢問接收器的環境:使用該接收器創建的操作狀態將在哪個調度器上啟動。 (定製點對象) | |
| 詢問可查詢對象以獲得可用於為向前進展委託目的而向之委託工作的調度器 (定製點對象) | |
| 從發送器的屬性中獲取與某個完成標籤關聯的完成調度器 (定製點對象) | |
| 詢問調度器的 execution::forward_progress_guarantee (定製點對象) | |
完成簽名
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
| 編碼一組完成簽名的集合的類型 (類模板) | |
| 獲得發送器的完成簽名 (定製點對象) | |
(C++26) |
獲得發送器的標籤類型 (別名模板) |
(C++26) |
獲得發送器的值完成類型 (別名模板) |
(C++26) |
獲得發送器的錯誤完成類型 (別名模板) |
(C++26) |
確定發送器是否支持停止完成 (變量模板) |
協程工具
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
變換表達式為特定協程中的可等待對象 (定製點對象) |
| 當用作協程承諾類型的基類時,使發送器在該協程類型之中可等待 (類模板) | |
核心操作
操作狀態
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
連接 sender 和 receiver (定製點對象) |
(C++26) |
啟動與某 operation_state 對象關聯的異步操作 (定製點對象) |
完成函數
這些函數由發送器調用,以向它們的接收器告知工作完成。
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
值完成函數,指出已成功完成 (定製點對象) |
(C++26) |
錯誤完成函數,指出計算或調度時發生了錯誤 (定製點對象) |
(C++26) |
停止完成函數,指出操作在能夠達成成功或失敗之前就已結束 (定製點對象) |
發送器算法
| 本節未完成 原因:WIP update to current standard in progress |
發送器工廠
發送器工廠是返回發送器的函數,且其形參具有使得概念 sender 為 false 的類型。
以下為發送器工廠:
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
接受一組可變數量的實參並返回一個發送器,當它被連接並啟動時,將通過把各實參傳遞給接收器的值完成函數而同步地完成 (定製點對象) |
(C++26) |
接受單個實參並返回一個發送器,當它被連接並啟動時,將通過把實參傳遞給接收器的錯誤完成函數而同步地完成 (定製點對象) |
(C++26) |
創建發送器,它通過調用其接收器的 set_stopped 立即完成 (定製點對象) |
(C++26) |
創建發送器,它查詢其接收器的關聯環境 (定製點對象) |
(C++26) |
準備一個要在給定調度器上執行的任務圖 (定製點對象) |
可連接管道的發送器適配器
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
| 用於定義可連管道發送器適配器閉包對象的輔助基類模板 (類模板) | |
發送器適配器
發送器適配器是返回發送器的函數,且它包含至少一個形參的類型滿足 sender 概念,且所返回的發送器是此適配器函數的發送器實參的父發送器。
以下為發送器適配器:
在標頭
<execution> 定義 | |
在命名空間
std::execution 定義 | |
(C++26) |
適配所提供發送器為在所提供調度器的執行支援上啟動一次執行的發送器 (定製點對象) |
(C++26) |
適配所提供發送器為在所提供調度器的執行資源上完成的發送器 (定製點對象) |
(C++26) |
適配所提供發送器為將執行轉移到所提供調度器的執行資源以在其上運行發送器或繼續,隨後將執行轉移回到原執行資源 (定製點對象) |
(C++26) |
調度依賴於所提供發送器的完成的工作到所提供調度器的執行資源上 (定製點對象) |
(C++26) |
以一個節點串聯輸入發送器的任務圖,該節點表示以輸入發送器所發送的各值為實參調用所提供的函數 (定製點對象) |
(C++26) |
以一個節點串聯輸入發送器的任務圖,該節點表示當發送錯誤時以輸入發送器所發送的錯誤調用所提供的函數 (定製點對象) |
(C++26) |
以一個節點串聯輸入發送器的任務圖,該節點表示當被發送「停止」信號時以輸入發送器的停止行為調用所提供的函數 (定製點對象) |
(C++26) |
返回表示一個串聯到輸入發送器的節點的發送器,啟動時,以輸入發送器所發送的值為實參調用所提供的函數 (定製點對象) |
(C++26) |
返回表示一個串聯到輸入發送器的節點的發送器,它以輸入發送器的錯誤(若發生)調用所提供的函數 (定製點對象) |
(C++26) |
返回表示一個串聯到輸入發送器上的節點的發送器,當發送了「停止」信號時,以輸入發送器的停止令牌調用所提供的函數 (定製點對象) |
| 創建一個多發發送器,它以所提供的形狀中的每個索引和輸入發送器所發送的值的來調用函數。該發送器在所有調用完成後,或發送錯誤時完成 (定製點對象) | |
(C++26) |
適配多個輸入發送器為一個當所有輸入發送器都已完成時完成的發送器 (定製點對象) |
| 適配多個輸入發送器(每個都可能具有多個完成簽名)為一個當所有輸入發送器完成時完成的發送器 (定製點對象) | |
(C++26) |
返回一個發送器,發送輸入發送器發送的所有可能類型集合的元組的變體 (定製點對象) |
返回將值通道映射為 std::optional<std::decay_t<T>> 並將停止通道映射為 std::nullopt 的發送器 (定製點對象) | |
(C++26) |
返回將停止通道映射為一個錯誤的發送器 (定製點對象) |
發送器消耗器
發送器消耗器是一種算法,它接受一個或多個發送器為參數且並不返回發送器。
在標頭
<execution> 定義 | |
在命名空間
std::this_thread 定義 | |
(C++26) |
阻塞當前線程直到指定發送器完成並返回其異步結果 (定製點對象) |
| 阻塞當前線程直到指定的帶有可能多個完成簽名的發送器完成並返回其異步結果 (定製點對象) | |
示例
此示例的一個版本在 godbolt.org,它使用的是 stdexec,一個 std::execution 的實驗性參考實現。
運行此代碼
#include <cstdio>
#include <execution>
#include <string>
#include <thread>
#include <utility>
using namespace std::literals;
int main()
{
std::execution::run_loop loop;
std::jthread worker([&](std::stop_token st)
{
std::stop_callback cb{st, [&]{ loop.finish(); }};
loop.run();
});
std::execution::sender auto hello = std::execution::just("hello world"s);
std::execution::sender auto print
= std::move(hello)
| std::execution::then([](std::string msg)
{
return std::puts(msg.c_str());
});
std::execution::scheduler auto io_thread = loop.get_scheduler();
std::execution::sender auto work = std::execution::on(io_thread, std::move(print));
auto [result] = std::this_thread::sync_wait(std::move(work)).value();
return result;
}
輸出:
hello world
參閱
(C++11) |
異步運行一個函數(有可能在新線程中執行),並返回將保有它的結果的 std::future (函數模板) |