Connect with us

Künstliche Intelligenz

Asynchrone Programmierung – Teil 1: C++ komfortabel mit Boost.Asio


Mit Boost.Asio gibt es eine altbekannte und dennoch moderne, effiziente und mächtige Bibliothek für die asynchrone Programmierung in C++. Je nach C++-Version können Entwicklerinnen und Entwickler damit auf verschiedene Arten asynchron programmieren, ohne dabei auf komplizierte und fehleranfällige Threading-Mechanismen zurückgreifen zu müssen.


Martin Meeser

Martin Meeser

Martin Meeser ist selbständiger Diplominformatiker (Uni) und bietet Dienstleistungen zum Thema Softwareentwicklung an: Individual-Software-Entwicklung, Beratung zu Prozessen und Schulungen. In zahlreichen Projekten betreute er bisher Kunden unter anderem aus den Bereichen Automotive, Finance, Raumfahrt, Radioastronomie und Medizintechnik.

Dieser Artikel bildet den Auftakt einer Reihe zur asynchronen Programmierung in verschiedenen Sprachen – außer Python, das vor Kurzem erst vorgestellt wurde.

Auf Linux-Systemen kann man Boost in einer aktuellen Version über die diversen Paketverwaltungen beziehen, unter Ubuntu ist das beispielsweise mit apitude aktuell die Version 1.83:

sudo apt-get install libboost-all-dev

Möchte man die neueste Version (aktuell 1.89) einsetzen oder arbeitet unter Windows, lädt man Boost von der Homepage und baut es selbst. Die entsprechenden Anleitungen finden sich beim Anbieter. Es gibt auch eine baugleiche, reine Asio-Bibliothek – ohne Boost-Abhängigkeiten und mit einem anderen Namespace, die hier aber nicht betrachtet wird.

Grundsätzlich erfordert asynchrone Programmierung ein verwaltendes System, das die API sowie die Mechanismen bereitstellt und den Programmablauf orchestriert. Hier hat sich allgemein der Begriff „Event Loop“ etabliert, Boost.Asio spricht jedoch von „Context“. Der geläufige Ansatz ist es, einen io_context zu verwenden, wie folgendes Beispiel zeigt:


#include 
#include 

int main()
{
    boost::asio::io_context io_context;
    boost::asio::post(io_context, []()
    {
        std::cout << "Hello World from async context!" << std::endl;
    });

    // async execution startet nach dem Aufruf von io_context.run()
    io_context.run(); // run() blockiert bis keine Arbeit mehr vorliegt
}


Listing 1: Einfaches Beispiel zur Verwendung eines Kontextes

post() reiht das Funktionsobjekt, das als Parameter übergeben wird – hier ein Lambda – in die Warteschlange des Kontexts ein und springt sofort zurück.

Der Kontext startet durch den Aufruf von io_context.run() und beginnt nun, die Funktionen der Reihe nach abzuarbeiten. In dem Beispiel wird „Hello World…“ also erst nach io_context.run() ausgegeben.

So initialisiert man das Programm, ohne dass asynchrone Mechanismen auf ein nicht fertig initialisiertes System einwirken. Das vermeidet Fehler, die unter bestimmten Umständen auftreten und schwer zu finden sind, beispielsweise zufällige Nachrichten aus einem anderen Prozess oder eine hohe Auslastung der CPU durch ein anderes Programm.

Die Methode io_context.run() endet, sobald keine Aufgaben mehr vorhanden sind oder io_context.stop() aufgerufen wird. io_context.run() kann man nur einmal pro Thread verwenden. Es ist aber möglich, run() mit dem gleichen io_context aus mehreren Threads aufzurufen.

Im Fall von Listing 1 übergibt der io_context die Arbeit einem Thread, was eine nebenläufige (concurrent) Ausführung bedeutet. In Listing 2 wird io_context.run() von mehreren Threads aus aufgerufen. Übergibt man nun Aufgaben an den Kontext, dann führt dieser die Aufgaben sofort auf einem der Threads aus. Diese Ausführung ist wirklich parallel. Sind alle Threads bereits mit Arbeit ausgelastet, wird die neue Aufgabe in eine Warteschlange eingereiht. Sobald einer der Threads seine Aufgabe abgeschlossen hat, teilt Context ihm Arbeit aus der Warteschlange zu.


#include 
#include 
#include 
#include 

int main()
{
    boost::asio::io_context io_context;

    int n = 4;
    std::vector<:thread> threads(n);
    for (int i = 0; i < n; i++)
    {
        threads[i] = std::thread([&io_context](){ io_context.run();});
    }

    // ... parallel asynchrone Aktionen hier

    for (auto& t : threads)
    {
        if (t.joinable()){ t.join(); }
    }
}


Listing 2: Verwendung von mehreren Threads in einem io_context

Hier erahnt man bereits die Stärke des asynchronen Programmierstils: Die ausführenden Einheiten sind abgelöst von einem konkreten Thread. Asynchrone Programme skalieren nativ und nutzen so viele Ressourcen, wie zur Verfügung stehen.

Nach meiner Erfahrung ist in der Regel ein Thread völlig ausreichend, während mehrere Threads vor allem bei Serversystemen oder ganz speziellen Aufgaben interessant sind, beispielweise zur Berechnung großer Primzahlen oder anderer algorithmischer Probleme. Je mehr Threads (bzw. CPU-Kerne) dem Kontext zur Verfügung stehen, desto mehr Teil-Berechnungen können parallel erfolgen – ohne jede Veränderung des Programms. Entwickler können sich vollständig auf die Funktionalität konzentrieren.

Es ist möglich, das Verhalten von io_context.run() zu verändern, indem man einen work_guard verwendet, wie in Listing 3 zu sehen ist.


#include 
#include 

int main()
{
    boost::asio::io_context io_context;
    boost::asio::executor_work_guard<:asio::io_context::executor_type>
    work_guard(io_context.get_executor());

    boost::asio::post(io_context, []()
    {
        std::cout << "Hello World from async context." << std::endl;
    });

    boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
    signals.async_wait([&io_context /*&work_guard*/]
        (const boost::system::error_code& ec, int signal)
        {
            io_context.stop(); // bricht sofort alles ab
            // work_guard.reset(); // bricht ab, wenn alles fertig ist
        });

    io_context.run();
}


Listing 3: executor_work_guard kann verhindern, dass run() zurückspringt, wenn context keine Arbeit mehr hat.

Nun springt io_context.run() erst dann zurück, wenn zum einen io_context.stop() aufgerufen wurde – in diesem Fall kommen bereits vorgesehene Aufgaben nicht mehr zur Ausführung und gerade laufende werden mit einem Abbruch-Fehler gestoppt. Zum anderen springt die Funktion zurück, wenn work_guard.reset() aufgerufen wurde – dann arbeitet das Programm alle gerade laufenden und auch alle vorgesehenen Aufgaben noch ab.

Bei letzterem sollten Entwicklerinnen und Entwickler darauf achten, dass sie innerhalb der eingereihten Einheiten keine neuen Aufgaben hinzufügen – denn sonst gerät der Code in eine asynchrone Endlosschleife und io_context.run() wird niemals enden.

Es gibt noch zwei weitere Kontexte in Boost.Asio: thread_pool (siehe Listing 4) und system_context (siehe Listing 5).


#include 
#include 

int main()
{
    boost::asio::thread_pool thread_pool(16);
    boost::asio::post(thread_pool, []()
    {
        std::cout << "Hello World from async context!" << std::endl;
    });

    // thread_pool.stop(); // bricht alle Arbeit im Pool sofort ab
    thread_pool.join(); // wartet bis alle Arbeit abgeschlossen ist


Listing 4: Beispielhafte Verwendung eines thread_pool

Der thread_pool ist eine einfache und empfohlene Alternative, wenn Entwickler mehrere Threads verwenden möchten und keine feingranulare Steuerung der einzelnen Threads benötigen. Eines muss man jedoch berücksichtigen: Im Gegensatz zum io_context startet thread_pool direkt nach der Konstruktion. Ansonsten verhält es sich analog zum io_context: Mit der Methode thread_pool.stop() brechen Entwickler die Ausführung sofort ab, mit thread_pool.join() beendet das Programm aber noch alle Aufgaben. Wurde vorher stop() aufgerufen, dann springt join() sofort zurück.

Der system_context ist von überall immer verfügbar – er muss nicht gestartet oder gestoppt werden. Er ist eine gute Wahl, wenn Entwickler an einem bestimmten Punkt ohne großen Aufwand und Vorbereitung – aber auch ohne eigene Steuerung – asynchrone Operationen ausführen möchten.


#include 
#include 

int main()
{
    boost::asio::system_context system_context;
    boost::asio::post(system_context, []()
    {
        std::cout << "Hello World from async context!" << std::endl;
    });
}


Listing 5: Beispielhafte Verwendung von system_context



Source link

Künstliche Intelligenz

heise+ Update vom 10. Oktober 2025: Lesetipps fürs Wochenende


Liebe Leserinnen und Leser,

da ich keinen Fisch – und entsprechend keine Fischsauce – esse, stand ich in meinem letzten Japan-Urlaub vor einem riesigen Problem: Wie bekomme ich diese Fischsauce aus meinem Essen?! Um meine Bestellung aufzugeben, musste ich also wild in mein Smartphone tippen und den Kellnern mein Handy samt geöffneter Übersetzungs-App in die Hand drücken, damit sie überhaupt verstehen, was ich meine.

Das geht garantiert effizienter – und zwar mit einem digitalen Dolmetscher (und nicht erst nach einem Japanisch-Kurs). Mein Kollege Ben Schwan hat sich angesehen, wie Apple mit iOS 26 und den neuen AirPods die Live-Übersetzung Realität werden lässt. Ich finde die Idee total faszinierend, wie zwei Menschen mit unterschiedlichen Sprachen sich fast nahtlos unterhalten können. Beim nächsten Mal klappt es dann hoffentlich auch mit meiner Essensbestellung deutlich einfacher!


Das war die Leseprobe unseres heise-Plus-Artikels “ heise+ Update vom 10. Oktober 2025: Lesetipps fürs Wochenende „.
Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.



Source link

Weiterlesen

Künstliche Intelligenz

#TGIQF – Das Quiz um Jupiter, Juno und Co.


In dieser Woche wurde bekannt, dass die Jupitersonde Juno kurz vor ihrem regulären Ende zu sein scheint, aber bei der NASA derzeit niemand etwas dazu sagen kann. Grund dafür ist der Shutdown: Die USA befinden sich im Haushaltsstreit und haben die Belegschaft nach Hause geschickt, was auch die Raumfahrtagentur trifft.

Die Sonde trat im Jahr 2011 den Weg zum Jupiter an und lenkte nach fünf Jahren Reise in die Umlaufbahn des größten Planeten des Sonnensystems ein. Die Erkenntnisse, die die Raumsonde durch die Erforschung des Gasplaneten gewann, waren verblüffend. Beispielsweise sprechen Messungen gegen die bisherige Annahme der Wissenschaft, dass ein erdgroßer Felskern in Jupiter existieren müsse. Auch die Atmosphäre verhält sich völlig anders als zuvor von den Wissenschaftlern vermutet.


#TGIQF: Das heise-online-Quiz

#TGIQF: Das heise-online-Quiz

„Thank God It’s Quiz Friday!“ Jeden Freitag gibts ein neues Quiz aus den Themenbereichen IT, Technik, Entertainment oder Nerd-Wissen:

Jetzt steht wohl die bereits verlängerte Mission vor dem Ende, auch weil der Treibstoff für Kurskorrekturen langsam ausgeht. Doch was bedeutet der Name „Juno“ eigentlich? Das wollen wir von Ihnen wissen in unserem kleinen Juno-trifft-Jupiter-Quiz am Wochenende. Ein paar Fragen zur Mission und ein paar Fragen zu dem Gasriesen.

In der heiseshow stellte Moderatorin Anna Bicker der Stammbesetzung Dr. Volker Zota und Malte Kirchner wie immer drei Fragen vorab. Die Zwei blieben nicht nur exzellent in der Zeit, sondern schlugen sich zudem wacker in Sachen Jupiter-Fragen.

Schnellrater können mit flinken Entscheidungen mehr Punkte abgreifen. Im Optimalfall 12 Fragen können Sie satte 240 Punkte erreichen. Die Punktzahl kann gern im Forum mit anderen Mitspielern verglichen werden. Halten Sie sich dabei aber bitte mit Spoilern zurück, um anderen Teilnehmern nicht die Freude am Quiz zu verhageln. Lob und Kritik sind wie immer gern genommen.

Bleiben Sie zudem auf dem Laufenden und erfahren Sie das Neueste aus der IT-Welt: Folgen Sie uns auf den Kurznachrichten-Netzwerken Bluesky und Mastodon und auf den Meta-Ebenen Facebook oder Instagram. Falls Sie eigene Ideen oder Fragen für ein neues Quiz haben, dann schreiben Sie einfach dem Quizmaster.


(mawi)





Source link

Weiterlesen

Künstliche Intelligenz

Last call: c’t-Webinar – Chancen, Grenzen, Kosten von Wärmepumpen


Wärmepumpen spielen eine zentrale Rolle in der Energiewende. Sie senken den CO₂-Ausstoß und dämpfen steigende Heizkosten. Dennoch zögern viele Hausbesitzer: Lohnt sich der Einbau auch in älteren Gebäuden? Funktionieren Wärmepumpen ohne Fußbodenheizung? Und rechtfertigen die Anschaffungskosten den Nutzen?

Im c’t-Webinar erhalten Sie eine herstellerunabhängige Einführung in die Wärmepumpentechnik. c’t-Redakteur Georg Schnurer erklärt, wie verschiedene Wärmepumpentypen arbeiten und welche Schritte nötig sind, um ihre Eignung für das eigene Haus oder die Wohnung realistisch einzuschätzen.

Die Veranstaltung richtet sich an Einsteiger ohne Vorkenntnisse. Schnurer nimmt gängige Vorurteile unter die Lupe, zeigt technische Grenzen auf und erklärt, was hinter dem Schlagwort Effizienz im Zusammenhang mit Wärmepumpen steckt. Sie erfahren außerdem, wie Wärmepumpen mit Photovoltaikanlagen zusammenspielen und welche Investitionskosten Sie grob einkalkulieren sollten.

Das rund zweistündige Webinar vermittelt Ihnen das nötige Wissen, um Angebote von Heizungsbauern besser beurteilen zu können. Im Anschluss bleibt in einer 45-minütigen Fragerunde Raum für individuelle Fragen. Wichtig: Das Webinar ersetzt keine persönliche Energieberatung – eine fundierte Entscheidung erfordert stets eine detaillierte Gebäudeanalyse.

Der Crashkurs findet am 16. Oktober 2025 von 17:00 bis 20:00 Uhr online statt und kostet 69,00 Euro. Ein aktueller Browser reicht für den Livestream aus. Weitere Informationen zur Veranstaltung und zur Anmeldung finden Sie auf der heise-academy-Seite zum Webinar.


(abr)



Source link

Weiterlesen

Beliebt