Execution control library (since C++26)
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
|
|
|
(C++26)
|
spezifiziert, dass ein Typ ein Scheduler ist
(Konzept) |
Sender
|
Definiert in Header
<execution>
|
|
|
Definiert in Namespace
std::execution
|
|
|
(C++26)
|
spezifiziert, dass ein Typ ein Sender ist
(Konzept) |
|
(C++26)
|
spezifiziert einen Sender, der asynchrone Operationen für einen gegebenen assoziierten Umgebungstyp erstellen kann
(Konzept) |
|
(C++26)
|
spezifiziert einen Sender, der mit einem spezifischen Empfängertyp verbunden werden kann
(Konzept) |
Empfänger
|
Definiert in Header
<execution>
|
|
|
Definiert in Namespace
std::execution
|
|
|
(C++26)
|
spezifiziert, dass ein Typ ein Receiver ist
(Konzept) |
|
(C++26)
|
spezifiziert, dass ein Typ ein Receiver für gegebene Completion-Signaturen ist
(Konzept) |
Betriebszustände
|
Definiert im Header
<execution>
|
|
|
Definiert im Namespace
std::execution
|
|
|
(C++26)
|
spezifiziert, dass ein Typ ein Operation State ist
(Konzept) |
Hilfskomponenten
Ausführungskontexte
|
Definiert im Header
<execution>
|
|
|
Definiert im Namespace
std::execution
|
|
|
(C++26)
|
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
|
|
|
(C++26)
|
Standard-Ausführungsdomäne-Tag-Typ, der Transformationen von einem Sender-Tag verteilt
(Klasse) |
|
(C++26)
|
transformiert in einen neuen Sender unter einem gegebenen Ausführungsdomäne-Tag
(Funktions-Template) |
|
(C++26)
|
transformiert in ein neues abfragbares Objekt unter einem gegebenen Ausführungsdomäne-Tag
(Funktions-Template) |
|
(C++26)
|
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
|
|
|
(C++26)
|
erstellt ein abfragbares Objekt aus einem Abfrageobjekt und einem Wert
(Klassentemplate) |
|
(C++26)
|
aggregiert mehrere abfragbare Objekte zu einem abfragbaren Objekt
(Klassentemplate) |
|
(C++26)
|
gibt das assoziierte abfragbare Objekt für sein gegebenes Argument zurück
(Customization Point Object) |
Abfragen
|
Definiert in Header
<execution>
|
|
|
(C++26)
|
fragt ein Query-Objekt, ob es durch queryfähige Adapter weitergeleitet werden soll
(Anpassungspunktobjekt) |
|
(C++26)
|
fragt ein queryfähiges Objekt nach seinem zugeordneten Allokator
(Anpassungspunktobjekt) |
|
(C++26)
|
fragt ein queryfähiges Objekt nach seinem zugeordneten Stop-Token
(Anpassungspunktobjekt) |
|
(C++26)
|
fragt ein queryfähiges Objekt nach seinem zugeordneten Ausführungsdomänen-Tag
(Anpassungspunktobjekt) |
|
(C++26)
|
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
|
|
|
(C++26)
|
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) |
|
|
(C++26)
|
ermittelt den Tag-Typ eines Senders
(Alias-Template) |
|
(C++26)
|
ermittelt den Value-Completion-Typ eines Senders
(Alias-Template) |
|
(C++26)
|
ermittelt den Error-Completion-Typ eines Senders
(Alias-Template) |
|
(C++26)
|
bestimmt, ob der Sender stopped-Completion unterstützt
(Variable Template) |
Coroutinen-Hilfsfunktionen
|
Definiert im Header
<execution>
|
|
|
Definiert im Namespace
std::execution
|
|
|
(C++26)
|
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
|
|
|
(C++26)
|
verbindet einen
sender
mit einem
receiver
(Anpassungspunktobjekt) |
|
(C++26)
|
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
|
|
|
(C++26)
|
Wert-Abschlussfunktion, die erfolgreichen Abschluss anzeigt
(Anpassungspunktobjekt) |
|
(C++26)
|
Fehler-Abschlussfunktion, die anzeigt, dass während der Berechnung oder Planung ein Fehler aufgetreten ist
(Anpassungspunktobjekt) |
|
(C++26)
|
Gestoppte Abschlussfunktion, die anzeigt, dass eine Operation endete, bevor sie Erfolg oder Fehler erreichen konnte
(Anpassungspunktobjekt) |
Sender-Algorithmen
|
Dieser Abschnitt ist unvollständig
Grund: WIP-Aktualisierung auf aktuellen Standard in Arbeit |
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
|
|
|
(C++26)
|
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) |
|
(C++26)
|
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) |
|
(C++26)
|
Erstellt einen Sender, der sofort abschließt, indem er den
set_stopped
seines Empfängers aufruft
(Customization Point Object) |
|
(C++26)
|
Erstellt einen Sender, der die assoziierte Umgebung seines Empfängers abfragt
(Customization Point Object) |
|
(C++26)
|
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
|
|
|
(C++26)
|
passt einen bereitgestellten Sender so an, dass eine Ausführung auf der Ausführungsressource des bereitgestellten Schedulers gestartet wird
(Anpassungspunktobjekt) |
|
(C++26)
|
passt einen bereitgestellten Sender so an, dass er auf der Ausführungsressource des bereitgestellten Schedulers abgeschlossen wird
(Anpassungspunktobjekt) |
|
(C++26)
|
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) |
|
(C++26)
|
plant Arbeit, die von der Vollendung eines bereitgestellten Senders abhängt, auf die Ausführungsressource eines bereitgestellten Schedulers
(Anpassungspunktobjekt) |
|
(C++26)
|
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) |
|
(C++26)
|
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) |
|
(C++26)
|
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) |
|
(C++26)
|
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) |
|
(C++26)
|
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) |
|
(C++26)
|
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) |
|
|
(C++26)
|
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) |
|
(C++26)
|
passt mehrere Eingabe-Sender zu einem Sender an, der abgeschlossen wird, sobald alle Eingabe-Sender abgeschlossen sind
(Anpassungspunktobjekt) |
|
(C++26)
|
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) |
|
(C++26)
|
Gibt einen Sender zurück, der eine Variante von Tupeln aller möglichen Typensätze sendet, die vom Eingangssender gesendet werden
(Anpassungspunktobjekt) |
|
(C++26)
|
gibt einen Sender zurück, der den Wertkanal auf
std::
optional
<
std::
decay_t
<
T
>>
und den Stoppkanal auf
std::
nullopt
abbildet
(Anpassungspunktobjekt) |
|
(C++26)
|
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
|
|
|
(C++26)
|
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) |