Asynchrone Programmierung in C++: Vollständiger Leitfaden für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einführung in die asynchrone Programmierung in C++

\n\n

In der modernen Softwareentwicklung spielen Leistung und Reaktionsfähigkeit von Anwendungen eine Schlüsselrolle. Asynchrone Programmierung in C++ ermöglicht es, Systemressourcen effizient zu nutzen, indem mehrere Aufgaben gleichzeitig ausgeführt werden, ohne den Hauptthread zu blockieren. Dies ist besonders wichtig bei Netzwerkanfragen, Ein-/Ausgabeoperationen und langwierigen Berechnungen.

\n\n

Im Gegensatz zum traditionellen synchronen Ansatz, bei dem jede Operation nacheinander ausgeführt wird, kann asynchroner Code Aufgaben im Hintergrund starten und Ergebnisse abrufen, sobald sie bereit sind. In diesem Leitfaden betrachten wir die wichtigsten Werkzeuge der asynchronen Programmierung in C++, beginnend mit einfachen Konzepten bis hin zu den modernen Möglichkeiten des C++20-Standards.

\n\n

Grundlagen der Asynchronität: std::async und std::future

\n\n

Der einfachste Weg, mit asynchroner Programmierung in C++ zu beginnen, ist die Verwendung von std::async. Diese Funktion startet eine Aufgabe asynchron und gibt ein std::future-Objekt zurück, das das Ergebnis der Ausführung enthält.

\n\n

Basisbeispiel mit std::async

\n\n
#include <iostream>\n#include <future>\n#include <chrono>\n\nint lange_operation() {\n    std::this_thread::sleep_for(std::chrono::seconds(2));\n    return 42;\n}\n\nint main() {\n    std::cout << "Asynchrone Aufgabe wird gestartet..." << std::endl;\n    \n    // Start der asynchronen Aufgabe\n    std::future<int> ergebnis = std::async(std::launch::async, lange_operation);\n    \n    std::cout << "Hauptthread arbeitet weiter..." << std::endl;\n    \n    // Ergebnis abrufen (blockiert den Thread bis zur Bereitschaft)\n    int wert = ergebnis.get();\n    std::cout << "Ergebnis: " << wert << std::endl;\n    \n    return 0;\n}
\n\n

Die Startrichtlinie std::launch::async garantiert, dass die Funktion in einem separaten Thread ausgeführt wird. Eine Alternative ist std::launch::deferred, die die Ausführung bis zum Aufruf von get() verzögert.

\n\n

Arbeiten mit mehreren Aufgaben

\n\n

Asynchrone Programmierung ist besonders effektiv bei der parallelen Ausführung mehrerer unabhängiger Aufgaben:

\n\n
#include <iostream>\n#include <future>\n#include <vector>\n\nint quadrat_berechnen(int x) {\n    return x * x;\n}\n\nint main() {\n    std::vector<std::future<int>> aufgaben;\n    \n    // Mehrere asynchrone Aufgaben starten\n    for (int i = 1; i <= 5; ++i) {\n        aufgaben.push_back(std::async(std::launch::async, quadrat_berechnen, i));\n    }\n    \n    // Ergebnisse sammeln\n    for (auto& aufgabe : aufgaben) {\n        std::cout << "Ergebnis: " << aufgabe.get() << std::endl;\n    }\n    \n    return 0;\n}
\n\n

Fortgeschrittene Werkzeuge: std::promise und std::packaged_task

\n\n

Für eine flexiblere Steuerung asynchroner Operationen in C++ stehen std::promise und std::packaged_task zur Verfügung. Diese Werkzeuge ermöglichen es, Werte zwischen Threads zu übertragen und aufrufbare Objekte zu kapseln.

\n\n

Verwendung von std::promise

\n\n

std::promise ermöglicht es, einen Wert festzulegen, der später über das entsprechende std::future-Objekt abgerufen wird:

\n\n
#include <iostream>\n#include <future>\n#include <thread>\n\nvoid producer_thread(std::promise<std::string> versprechen) {\n    try {\n        std::string daten = "Wichtige Daten aus dem Thread";\n        // Wert festlegen\n        versprechen.set_value(daten);\n    } catch(...) {\n        // Ausnahmebehandlung\n        versprechen.set_exception(std::current_exception());\n    }\n}\n\nint main() {\n    std::promise<std::string> versprechen;\n    std::future<std::string> zukunft = versprechen.get_future();\n    \n    std::thread thread(pro                

Blogs

Buchempfehlungen