名稱空間
變體
操作

執行控制庫 (自 C++26 起)

來自 cppreference.com
< cpp
 
 
 

執行控制庫提供了一個框架,用於管理通用執行資源上的非同步執行。

該庫旨在為非同步操作提供詞彙型別,並允許以簡單、可組合的方式構建任務執行圖。

目錄

[編輯] 庫範圍定義

  • 傳送器 (Sender):對要傳送執行的非同步工作的描述。產生一個操作狀態(見下)。
  • 傳送器非同步地將其結果“傳送”給稱為“接收器”(見下)的監聽器。
  • 傳送器可以使用通用演算法組合成任務圖
  • 傳送器工廠和介面卡是通用演算法,它們將常見的非同步模式封裝在滿足 sender 概念的物件中。
  • 接收器 (Receiver):一種通用回撥,用於消費或“接收”傳送器產生的非同步結果。
  • 接收器有三個不同的“通道”,傳送器可以透過這些通道傳播結果:成功、失敗和取消,分別稱為“值 (value)”、“錯誤 (error)”和“停止 (stopped)”。
  • 接收器提供了一個可擴充套件的執行環境:一組鍵/值對,消費者可以使用它們來引數化非同步操作。
  • 操作狀態 (Operation State):一個包含非同步操作所需狀態的物件。
  • 當傳送器和接收器傳遞給 std::execution::connect 函式時,它們被連線起來。
  • 連線傳送器和接收器的結果是一個操作狀態。
  • 在操作狀態上呼叫“start”之前,工作不會排隊執行。
  • 一旦啟動,操作狀態的生命週期不能在非同步操作完成之前結束,並且其地址必須是穩定的。
  • 排程器 (Scheduler):執行上下文的輕量級控制代碼。
  • 執行上下文是非同步執行的來源,例如執行緒池或 GPU 流。
  • 排程器是傳送器的工廠,該傳送器從執行上下文擁有的執行執行緒完成其接收器。

[編輯] 庫工具

[編輯] 概念

[編輯] 排程器

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
指定一個型別是排程器
(概念) [編輯]

[編輯] 傳送器

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
指定一個型別是傳送器
(概念) [編輯]
指定一個傳送器,它可以為給定的關聯環境型別建立非同步操作
(概念) [編輯]
指定一個傳送器,它可以與特定的接收器型別連線
(概念) [編輯]

[編輯] 接收器

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
指定一個型別是接收器
(概念) [編輯]
指定一個型別是給定完成簽名的接收器
(概念) [編輯]

[編輯] 操作狀態

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
指定一個型別是操作狀態
(概念) [編輯]

[編輯] 實用元件

[編輯] 執行上下文

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
持有執行緒安全 MPSC 任務佇列和手動驅動事件迴圈的執行資源
(類) [編輯]

[編輯] 執行域

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
預設執行域標籤型別,從傳送器標籤分派轉換
(類) [編輯]
在給定執行域標籤下轉換為新的傳送器
(函式模板) [編輯]
在給定執行域標籤下轉換為新的可查詢物件
(函式模板) [編輯]
使用給定傳送器消費者標籤和一組引數消費一個傳送器,並在給定執行域標籤下返回其結果
(函式模板) [編輯]

[編輯] 前進保證

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
指定排程器關聯執行資源建立的執行代理的前進保證
(列舉) [編輯]

[編輯] 環境

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
(C++26)
從查詢物件和值構建一個可查詢物件
(類模板) [編輯]
(C++26)
將多個可查詢物件聚合成一個可查詢物件
(類模板) [編輯]
返回給定引數的關聯可查詢物件
(定製點物件)[編輯]

[編輯] 查詢

定義於標頭檔案 <execution>
詢問查詢物件是否應透過可查詢介面卡轉發
(定製點物件)[編輯]
(C++26)
詢問可查詢物件其關聯的分配器
(定製點物件)[編輯]
(C++26)
詢問可查詢物件其關聯的停止令牌
(定製點物件)[編輯]
詢問可查詢物件其關聯的執行域標籤
(定製點物件)[編輯]
詢問可查詢物件其關聯的排程器
(定製點物件)[編輯]
詢問可查詢物件一個排程器,該排程器可用於委託工作以實現前進委託
(定製點物件)[編輯]
從傳送器的屬性中獲取與完成標籤關聯的完成排程器
(定製點物件)[編輯]
詢問排程器關於其 execution::forward_progress_guarantee
(定製點物件)[編輯]

[編輯] 完成簽名

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
編碼一組完成簽名的型別
(類模板) [編輯]
獲取傳送器的完成簽名
(定製點物件)[編輯]
將一組完成簽名轉換為另一組
(別名模板)[編輯]
轉換髮送器的完成簽名
(別名模板)[編輯]
獲取傳送器的標籤型別
(別名模板)[編輯]
獲取傳送器的值完成型別
(別名模板)[編輯]
獲取傳送器的錯誤完成型別
(別名模板)[編輯]
確定傳送器是否支援停止完成
(變數模板)[編輯]

[編輯] 協程工具

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
將表示式轉換為特定協程中的可等待物件
(定製點物件)[編輯]
當用作協程承諾型別的基類時,使傳送器在該協程型別中可等待
(類模板) [編輯]

[編輯] 核心操作

[編輯] 操作狀態

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
連線 senderreceiver
(定製點物件)[編輯]
啟動與 operation_state 物件關聯的非同步操作
(定製點物件)[編輯]

[編輯] 完成函式

這些函式由傳送器呼叫,以通知其接收器工作完成。

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
值完成函式,表示成功完成
(定製點物件)[編輯]
錯誤完成函式,表示在計算或排程過程中發生錯誤
(定製點物件)[編輯]
停止完成函式,表示操作在未能成功或失敗之前結束
(定製點物件)[編輯]

[編輯] 傳送器演算法

[編輯] 傳送器工廠

傳送器工廠是一個返回傳送器,並且其引數型別不滿足 sender 概念的函式。

以下是傳送器工廠

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
(C++26)
接受可變數量的引數,並返回一個傳送器,該傳送器在連線和啟動時,透過將引數傳遞給接收器的值完成函式而同步完成
(定製點物件)[編輯]
接受單個引數,並返回一個傳送器,該傳送器在連線和啟動時,透過將引數傳遞給接收器的錯誤完成函式而同步完成
(定製點物件)[編輯]
建立一個傳送器,該傳送器透過呼叫其接收器的 set_stopped 立即完成
(定製點物件)[編輯]
建立一個傳送器,該傳送器查詢其接收器關聯的環境
(定製點物件)[編輯]
準備任務圖以在給定排程器上執行
(定製點物件)[編輯]

[編輯] 可管道化傳送器介面卡

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
用於定義可管道化傳送器介面卡閉包物件的輔助基類模板
(類模板) [編輯]

[編輯] 傳送器介面卡

傳送器介面卡是一個函式,它返回一個傳送器,其引數至少包含一個滿足 sender 概念的型別,並且返回的傳送器是介面卡函式傳送器引數的父傳送器。

以下是傳送器介面卡

定義於標頭檔案 <execution>
定義於名稱空間 std::execution
將提供的傳送器適配成一個將在提供的排程器的執行資源上開始執行的傳送器
(定製點物件)[編輯]
將提供的傳送器適配成一個將在提供的排程器的執行資源上完成的傳送器
(定製點物件)[編輯]
(C++26)
將提供的傳送器適配為將執行轉移到提供的排程器的執行資源上,傳送器或後續操作在此資源上執行,然後將執行轉移回原始資源
(定製點物件)[編輯]
排程依賴於所提供的傳送器完成的工作到所提供的排程器的執行資源上
(定製點物件)[編輯]
(C++26)
透過輸入傳送器將任務圖與一個節點連結起來,該節點表示使用輸入傳送器傳送的值作為引數呼叫提供的函式
(定製點物件)[編輯]
透過輸入傳送器將任務圖與一個節點連結起來,該節點表示如果發生錯誤,則使用輸入傳送器傳送的錯誤呼叫提供的函式
(定製點物件)[編輯]
透過輸入傳送器將任務圖與一個節點連結起來,該節點表示如果傳送“stopped”訊號,則使用輸入傳送器提供的停止行為呼叫提供的函式
(定製點物件)[編輯]
返回一個傳送器,它表示一個連結到輸入傳送器的節點,當啟動時,它將使用輸入傳送器傳送的值作為引數呼叫提供的函式
(定製點物件)[編輯]
返回一個傳送器,它表示一個連結到輸入傳送器的節點,如果發生錯誤,它將使用輸入傳送器的錯誤呼叫提供的函式
(定製點物件)[編輯]
返回一個傳送器,它表示一個連結到輸入傳送器的節點,如果傳送“stopped”訊號,它將使用輸入傳送器的停止令牌呼叫提供的函式
(定製點物件)[編輯]
建立一個多發發送器,它使用提供的形狀中的每個索引以及輸入傳送器傳送的值來呼叫函式。一旦所有呼叫完成或發生錯誤,傳送器完成
(定製點物件)[編輯]
如果提供的傳送器是多發發送器,則返回該傳送器;否則,返回一個傳送與提供的傳送器等效的值的多發發送器
(定製點物件)[編輯]
將多個輸入傳送器適配成一個傳送器,當所有輸入傳送器都完成時,該傳送器完成
(定製點物件)[編輯]
將多個輸入傳送器(每個可能具有多個完成簽名)適配成一個傳送器,當所有輸入傳送器都完成時,該傳送器完成
(定製點物件)[編輯]
返回一個傳送器,該傳送器傳送一個由輸入傳送器可能傳送的所有型別集合組成的元組變體
(定製點物件)[編輯]
返回一個傳送器,它將值通道對映到 std::optional<std::decay_t<T>>,將停止通道對映到 std::nullopt
(定製點物件)[編輯]
返回一個傳送器,它將停止通道對映到錯誤
(定製點物件)[編輯]

[編輯] 傳送器消費者

傳送器消費者是一個演算法,它接受一個或多個傳送器作為引數,並且不返回傳送器。

定義於標頭檔案 <execution>
定義於名稱空間 std::this_thread
阻塞當前執行緒直到指定的傳送器完成並返回其非同步結果
(定製點物件)[編輯]
阻塞當前執行緒直到指定的傳送器(可能具有多個完成簽名)完成並返回其非同步結果
(定製點物件)[編輯]

[編輯] 示例

此示例的一個版本可在 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
(函式模板) [編輯]