C++-Coroutinen einsetzen: Tasks und Generatoren, Teil 2

Am Beispiel des Verschachtelns zweier Vektoren zeigen wir in diesem Artikel, wie man Coroutinen in C++ effizient einsetzt.

Artikel verschenken
vorlesen Druckansicht
Lesezeit: 13 Min.
Von
  • Andreas Fertig
Inhaltsverzeichnis

Coroutinen sind in der Lage, ihre Ausführung zu unterbrechen und später wieder fortzusetzen, ohne dabei den aktuellen Zustand der Ausführung zu verlieren. Der erste Teil dieses Tutorials hat das Konzept und den Aufbau von Coroutinen erläutert. Der zweite Teil zeigt, wie unterschiedlich sich Coroutinen einsetzen lassen und welche Änderungen das im Datentyp promise_type bewirkt.

Für die hier aufgeführten Fälle sind zunächst zwei Definitionen erforderlich: Task bezeichnet eine Coroutine, die einen Job ausführt und void oder kein Ergebnis liefert. Generator definiert eine Coroutine, die einen Job ausführt und ein Ergebnis ungleich void bringt. Die Coroutine übergibt dem Aufrufer das Resultat via co_yield oder co_return.

iX-tract
  • Mit C++20-Coroutinen lassen sich zwei Vektoren einfach verschachteln.
  • Tasks sind Coroutinen, die void oder kein Ergebnis liefern, während Generatoren ein Ergebnis zurĂĽckliefern.
  • Der Datentyp promise_type stellt viele Anpassungspunkte (Customization Points) bereit, die individuell implementierbar sind.
  • Eine Iterator-Implementierung in Coroutinen ermöglicht es, Coroutinen als Generatoren zu verwenden, um Werte zu erzeugen, die schrittweise ĂĽber ein Iterator-Interface konsumiert werden können.

Ein Beispiel fĂĽr eine Task ist das Triggern eines Watchdog: FĂĽr das Gesamtsystem hat das Triggern ein Ergebnis, nicht aber fĂĽr das Resultat der Coroutine. Als Beispiel fĂĽr Generator dient eine Coroutine, die Daten aus einer Datei liest und dem Aufrufer zur VerfĂĽgung stellt.

Das war die Leseprobe unseres heise-Plus-Artikels "C++-Coroutinen einsetzen: Tasks und Generatoren, Teil 2". Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.