Namespaces
Variants

Execution control library (since C++26)

From cppreference.net

Die Execution Control-Bibliothek bietet ein Framework zur Verwaltung asynchroner Ausführung auf generischen Ausführungsressourcen.

Die Bibliothek zielt darauf ab, Vokabulartypen für asynchrone Operationen bereitzustellen und die Konstruktion von Aufgabenausführungsgraphen auf einfache, komponierbare Weise zu ermöglichen.

Inhaltsverzeichnis

Bibliotheksweite Definitionen

  • Sender : Eine Beschreibung asynchroner Arbeit, die zur Ausführung gesendet werden soll. Erzeugt einen Operationszustand (unten).
  • Sender senden ihre Ergebnisse asynchron an Listener, die "Receiver" genannt werden (unten).
  • Sender können mit generischen Algorithmen zu Task-Graphen zusammengesetzt werden.
  • Sender-Fabriken und -Adapter sind generische Algorithmen, die gängige asynchrone Muster in Objekten erfassen, die das sender Konzept erfüllen.
  • Receiver : Ein generalisierter Callback, der die asynchronen Ergebnisse verarbeitet oder "empfängt", die von einem Sender erzeugt werden.
  • Empfänger verfügen über drei verschiedene "Kanäle", über die ein Sender Ergebnisse propagieren kann: Erfolg, Fehler und Abbruch, genannt "Value", "Error" und "Stopped".
  • Empfänger bieten eine erweiterbare Ausführungsumgebung: einen Satz von Schlüssel/Wert-Paaren, den der Consumer zur Parametrisierung des asynchronen Vorgangs verwenden kann.
  • Betriebszustand : Ein Objekt, das den für den asynchronen Vorgang benötigten Zustand enthält.
  • Ein Sender und ein Empfänger werden verbunden, wenn sie an die std::execution::connect -Funktion übergeben werden.
  • Das Ergebnis der Verbindung eines Senders und eines Empfängers ist ein Operationszustand.
  • Arbeit wird erst zur Ausführung eingereiht, wenn " start " auf einem Operationszustand aufgerufen wird.
  • Einmal gestartet, darf die Lebensdauer des Operationszustands nicht enden, bevor der asynchrone Vorgang abgeschlossen ist, und seine Adresse muss stabil sein.
  • Scheduler : Ein leichtgewichtiger Handle für einen Ausführungskontext.
  • Ein Ausführungskontext ist eine Quelle asynchroner Ausführung wie ein Thread-Pool oder ein GPU-Stream.
  • Ein Scheduler ist eine Fabrik für einen Sender, der seinen Empfänger von einem Ausführungsthread abschließt, der dem Ausführungskontext gehört.

Bibliothekshilfsmittel

Konzepte

Scheduler

Definiert in Header <execution>
Definiert in Namespace std::execution
spezifiziert, dass ein Typ ein Scheduler ist
(Konzept)

Sender

Definiert in Header <execution>
Definiert in Namespace std::execution
spezifiziert, dass ein Typ ein Sender ist
(Konzept)
spezifiziert einen Sender, der asynchrone Operationen für einen gegebenen assoziierten Umgebungstyp erstellen kann
(Konzept)
spezifiziert einen Sender, der mit einem spezifischen Empfängertyp verbunden werden kann
(Konzept)

Empfänger

Definiert in Header <execution>
Definiert in Namespace std::execution
spezifiziert, dass ein Typ ein Receiver ist
(Konzept)
spezifiziert, dass ein Typ ein Receiver für gegebene Completion-Signaturen ist
(Konzept)

Betriebszustände

Definiert im Header <execution>
Definiert im Namespace std::execution
spezifiziert, dass ein Typ ein Operation State ist
(Konzept)

Hilfskomponenten

Ausführungskontexte

Definiert im Header <execution>
Definiert im Namespace std::execution
Ausführungsressource, die eine threadsichere MPSC Task-Warteschlange und eine manuell gesteuerte Ereignisschleife enthält
(Klasse)

Ausführungsdomänen

Definiert im Header <execution>
Definiert im Namespace std::execution
Standard-Ausführungsdomäne-Tag-Typ, der Transformationen von einem Sender-Tag verteilt
(Klasse)
transformiert in einen neuen Sender unter einem gegebenen Ausführungsdomäne-Tag
(Funktions-Template)
transformiert in ein neues abfragbares Objekt unter einem gegebenen Ausführungsdomäne-Tag
(Funktions-Template)
verarbeitet einen Sender mit einem gegebenen Sender-Consumer-Tag und einer Menge von Argumenten und gibt sein Ergebnis unter einem gegebenen Ausführungsdomäne-Tag zurück
(Funktions-Template)

Fortschrittsgarantie

Definiert im Header <execution>
Definiert im Namespace std::execution
spezifiziert eine Forward Progress Guarantee von Ausführungsagenten, die durch die zugehörige Ausführungsressource des Schedulers erstellt werden
(Enumeration)

Umgebungen

Definiert im Header <execution>
Definiert im Namespace std::execution
erstellt ein abfragbares Objekt aus einem Abfrageobjekt und einem Wert
(Klassentemplate)
aggregiert mehrere abfragbare Objekte zu einem abfragbaren Objekt
(Klassentemplate)
gibt das assoziierte abfragbare Objekt für sein gegebenes Argument zurück
(Customization Point Object)

Abfragen

Definiert in Header <execution>
fragt ein Query-Objekt, ob es durch queryfähige Adapter weitergeleitet werden soll
(Anpassungspunktobjekt)
fragt ein queryfähiges Objekt nach seinem zugeordneten Allokator
(Anpassungspunktobjekt)
fragt ein queryfähiges Objekt nach seinem zugeordneten Stop-Token
(Anpassungspunktobjekt)
fragt ein queryfähiges Objekt nach seinem zugeordneten Ausführungsdomänen-Tag
(Anpassungspunktobjekt)
fragt ein queryfähiges Objekt nach seinem zugeordneten Scheduler
(Anpassungspunktobjekt)
fragt ein queryfähiges Objekt nach einem Scheduler, der zur Delegierung von Arbeit für Zwecke der Fortschrittsdelegierung verwendet werden kann
(Anpassungspunktobjekt)
ermittelt den Abschluss-Scheduler, der einem Abschluss-Tag aus den Attributen eines Senders zugeordnet ist
(Anpassungspunktobjekt)
fragt einen Scheduler nach seiner execution::forward_progress_guarantee
(Anpassungspunktobjekt)

Abschlusssignaturen

Definiert in Header <execution>
Definiert in Namespace std::execution
Typ, der eine Menge von Completion-Signaturen kodiert
(Klassentemplate)
ermittelt die Completion-Signaturen eines Senders
(Customization Point Object)
transformiert eine Menge von Completion-Signaturen in eine andere
(Alias-Template)
transformiert Completion-Signaturen eines Senders
(Alias-Template)
ermittelt den Tag-Typ eines Senders
(Alias-Template)
ermittelt den Value-Completion-Typ eines Senders
(Alias-Template)
ermittelt den Error-Completion-Typ eines Senders
(Alias-Template)
bestimmt, ob der Sender stopped-Completion unterstützt
(Variable Template)

Coroutinen-Hilfsfunktionen

Definiert im Header <execution>
Definiert im Namespace std::execution
transformiert einen Ausdruck in ein awaitable-Objekt innerhalb einer bestimmten Coroutine
(Customization Point Object)
wenn als Basisklasse eines Coroutine-Promise-Typs verwendet, ermöglicht es Sendern, innerhalb dieses Coroutine-Typs awaitable zu sein
(Klassentemplate)

Kernoperationen

Betriebszustand

Definiert in Header <execution>
Definiert in Namespace std::execution
verbindet einen sender mit einem receiver
(Anpassungspunktobjekt)
startet den asynchronen Vorgang, der mit einem operation_state Objekt assoziiert ist
(Anpassungspunktobjekt)

Abschlussfunktionen

Diese Funktionen werden von Sendern aufgerufen, um den Abschluss der Arbeit ihren Empfängern mitzuteilen.

Definiert im Header <execution>
Definiert im Namespace std::execution
Wert-Abschlussfunktion, die erfolgreichen Abschluss anzeigt
(Anpassungspunktobjekt)
Fehler-Abschlussfunktion, die anzeigt, dass während der Berechnung oder Planung ein Fehler aufgetreten ist
(Anpassungspunktobjekt)
Gestoppte Abschlussfunktion, die anzeigt, dass eine Operation endete, bevor sie Erfolg oder Fehler erreichen konnte
(Anpassungspunktobjekt)

Sender-Algorithmen

Sender-Fabriken

Eine Sender-Factory ist eine Funktion, die einen Sender zurückgibt und deren Parameter Typen haben, für die das sender Konzept false ist.

Folgende sind Absender-Fabriken:

Definiert in Header <execution>
Definiert in Namespace std::execution
Akzeptiert eine variable Anzahl von Argumenten und gibt einen Sender zurück, der bei Verbindung und Start synchron abschließt, indem die Argumente an die Wert-Abschlussfunktion des Empfängers übergeben werden
(Customization Point Object)
Akzeptiert ein einzelnes Argument und gibt einen Sender zurück, der bei Verbindung und Start synchron abschließt, indem das Argument an die Fehler-Abschlussfunktion des Empfängers übergeben wird
(Customization Point Object)
Erstellt einen Sender, der sofort abschließt, indem er den set_stopped seines Empfängers aufruft
(Customization Point Object)
Erstellt einen Sender, der die assoziierte Umgebung seines Empfängers abfragt
(Customization Point Object)
Bereitet einen Task-Graphen zur Ausführung auf einem gegebenen Scheduler vor
(Customization Point Object)

Pipeable Sender-Adapter

Definiert im Header <execution>
Definiert im Namespace std::execution
Hilfsklassen-Template zur Definition eines pipe-fähigen Sender-Adaptor-Closure-Objekts
(Klassen-Template)

Sender-Adapter

Ein Sender-Adapter ist eine Funktion, die einen Sender zurückgibt, deren Parameter mindestens einen enthalten, dessen Typ das sender Konzept erfüllt, und bei der der zurückgegebene Sender ein übergeordneter Sender der Sender-Argumente der Adapterfunktion ist.

Folgende sind Sender-Adapter:

Definiert im Header <execution>
Definiert im namespace std::execution
passt einen bereitgestellten Sender so an, dass eine Ausführung auf der Ausführungsressource des bereitgestellten Schedulers gestartet wird
(Anpassungspunktobjekt)
passt einen bereitgestellten Sender so an, dass er auf der Ausführungsressource des bereitgestellten Schedulers abgeschlossen wird
(Anpassungspunktobjekt)
passt einen bereitgestellten Sender an, um die Ausführung auf die Ausführungsressource eines bereitgestellten Schedulers zu übertragen, auf der der Sender oder die Fortsetzung läuft, und überträgt dann die Ausführung zurück zur ursprünglichen Ressource
(Anpassungspunktobjekt)
plant Arbeit, die von der Vollendung eines bereitgestellten Senders abhängt, auf die Ausführungsressource eines bereitgestellten Schedulers
(Anpassungspunktobjekt)
verkettet den Task-Graphen des Eingabe-Senders mit einem Knoten, der das Aufrufen der bereitgestellten Funktion mit den vom Eingabe-Sender gesendeten Werten als Argumente darstellt
(Customization Point Object)
verkettet den Task-Graphen durch den Eingabe-Sender mit einem Knoten, der das Aufrufen der bereitgestellten Funktion mit dem vom Eingabe-Sender gesendeten Fehler darstellt, falls ein Fehler aufgetreten ist
(Anpassungspunktobjekt)
verkettet den Task-Graphen des Eingabe-Senders mit einem Knoten, der das Aufrufen der bereitgestellten Funktion mit dem Stopp-Verhalten des Eingabe-Senders repräsentiert, falls ein "Stopp"-Signal gesendet wird
(Anpassungspunkt-Objekt)
gibt einen Sender zurück, der einen an den Eingangssender geketteten Knoten repräsentiert, der bei Start die bereitgestellte Funktion mit den vom Eingangssender gesendeten Werten als Argumente aufruft
(Anpassungspunktobjekt)
Gibt einen Sender zurück, der einen an den Eingangssender geketteten Knoten darstellt, der die bereitgestellte Funktion mit dem Fehler vom Eingangssender aufruft, falls aufgetreten
(Anpassungspunktobjekt)
Gibt einen Sender zurück, der einen an den Eingangssender angeketteten Knoten repräsentiert, der die bereitgestellte Funktion mit dem Stopp-Token vom Eingangssender aufruft, falls das "gestoppte" Signal gesendet wird
(Anpassungspunktobjekt)
Erstellt einen Multi-Shot-Sender, der die Funktion mit jedem Index in der bereitgestellten Form zusammen mit den vom Eingabesender gesendeten Werten aufruft. Der Sender wird abgeschlossen, sobald alle Aufrufe abgeschlossen sind oder ein Fehler aufgetreten ist.
(Anpassungspunktobjekt)
falls der bereitgestellte Sender ein Multi-Shot-Sender ist, wird dieser Sender zurückgegeben, andernfalls wird ein Multi-Shot-Sender zurückgegeben, der Werte sendet, die äquivalent zu den Werten des bereitgestellten Senders sind
(Anpassungspunktobjekt)
passt mehrere Eingabe-Sender zu einem Sender an, der abgeschlossen wird, sobald alle Eingabe-Sender abgeschlossen sind
(Anpassungspunktobjekt)
passt mehrere Eingabe-Sender an, von denen jeder möglicherweise mehrere Abschlusssignaturen besitzt, zu einem Sender, der abschließt, sobald alle Eingabe-Sender abgeschlossen haben
(Anpassungspunktobjekt)
Gibt einen Sender zurück, der eine Variante von Tupeln aller möglichen Typensätze sendet, die vom Eingangssender gesendet werden
(Anpassungspunktobjekt)
gibt einen Sender zurück, der den Wertkanal auf std:: optional < std:: decay_t < T >> und den Stoppkanal auf std:: nullopt abbildet
(Anpassungspunktobjekt)
gibt einen Sender zurück, der den gestoppten Kanal auf einen Fehler abbildet
(Anpassungspunktobjekt)

Sender-Verbraucher

Ein Sender-Consumer ist ein Algorithmus, der einen oder mehrere Sender als Parameter nimmt und der keinen Sender zurückgibt.

Definiert im Header <execution>
Definiert im Namespace std::this_thread
blockiert den aktuellen Thread bis der angegebene Sender abgeschlossen ist und gibt sein asynchrones Ergebnis zurück
(Customization Point Object)
blockiert den aktuellen Thread bis der angegebene Sender mit möglicherweise mehreren Completion-Signaturen abgeschlossen ist und gibt sein asynchrones Ergebnis zurück
(Customization Point Object)

Beispiel

Eine Version dieses Beispiels ist verfügbar auf godbolt.org , wo es stdexec verwendet, eine experimentelle Referenzimplementierung von 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;
}

Ausgabe:

hello world

Siehe auch

(C++11)
führt eine Funktion asynchron aus (möglicherweise in einem neuen Thread) und gibt eine std::future zurück, die das Ergebnis enthalten wird
(Funktions-Template)