Softwareentwicklung: Scheduler mit C++-Coroutinen implementieren, Teil 3
Ein einfacher Scheduler nutzt C++-Coroutinen, um Aufgaben in einer Anwendung zu verwalten. Der dritte Teil des Tutorials zeigt, wie man ihn implementiert.
- Nicole Bechtel
- Andreas Fertig
Coroutinen ermöglichen es, asynchrone Programmieraufgaben übersichtlich zu strukturieren und parallele Ausführungen zu vereinfachen. Das kann besonders dann nützlich sein, wenn man einen einfachen Scheduler implementieren möchte, um verschiedene Aufgaben nacheinander oder parallel auszuführen. Die ersten beiden Teile des Tutorials haben die Grundlagen und verschiedenen Einsatzzwecke von Coroutinen gezeigt. Der dritte Teil erläutert, wie man Coroutinen mit einem Scheduler einsetzt.
Die erste Frage bei einem Coroutinen-basierten Scheduler ist, wieso man nicht einfach std::thread oder weitere Alternativen wie std::async, pthread, futex und Windows-Threads nutzt. Hier sind zwei unterschiedliche Formen des Multitaskings zu unterscheiden: präemptiv und kooperativ. Bei std::thread handelt es sich um präemptives Multitasking, das einigen Komfort bietet: Das Betriebssystem koordiniert die einzelnen Tasks und versieht sie mit Zeitscheiben. Besonders über mehrere Prozessorkerne hinweg wird damit eine gute Verteilung der Ressourcen erreicht.
- C++-Coroutinen kombiniert mit einem einfachen Scheduler ermöglichen es, asynchrone Programmieraufgaben übersichtlich zu strukturieren und parallele Ausführungen zu vereinfachen.
- Der Scheduler kann asynchrone Operationen handhaben, ohne dass Entwickler komplexe Callbacks oder Zustandsmaschinen direkt implementieren mĂĽssen.
- Beim kooperativen Multitasking arbeiten Coroutinen zusammen, was eine effiziente und vorhersehbare Parallelität erlaubt.
Gleichzeitig ergeben sich hierdurch Nachteile: Es ist nicht möglich zu kontrollieren, wann, auf welchem CPU-Kern und wie lange ein Thread läuft. Eine weitere Schwierigkeit liegt darin, den Thread bei präemptivem Multitasking zu unterbrechen. Um Datenstrukturen zu schützen, sind Locks (Mutex oder Ähnliches) zwingend nötig. Der Einsatz von Locks birgt Risiken: Ein fehlendes Lock kann zu fehlerhaften Daten führen und ein unnötiges Lock verlangsamt die Verarbeitungsgeschwindigkeit.
Das war die Leseprobe unseres heise-Plus-Artikels "Softwareentwicklung: Scheduler mit C++-Coroutinen implementieren, Teil 3". Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.