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 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.
Einbinden von Boost.Asio
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.
Context und Event Loop
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
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.
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.
„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)
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.
Mythen aufklären, Grenzen benennen
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)
-
UX/UI & Webdesignvor 2 Monaten
Der ultimative Guide für eine unvergessliche Customer Experience
-
UX/UI & Webdesignvor 1 Monat
Adobe Firefly Boards › PAGE online
-
Social Mediavor 2 Monaten
Relatable, relevant, viral? Wer heute auf Social Media zum Vorbild wird – und warum das für Marken (k)eine gute Nachricht ist
-
Entwicklung & Codevor 2 Monaten
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
Entwicklung & Codevor 1 Monat
EventSourcingDB 1.1 bietet flexiblere Konsistenzsteuerung und signierte Events
-
UX/UI & Webdesignvor 4 Wochen
Fake It Untlil You Make It? Trifft diese Kampagne den Nerv der Zeit? › PAGE online
-
Apps & Mobile Entwicklungvor 3 Monaten
Firefox-Update 141.0: KI-gestützte Tab‑Gruppen und Einheitenumrechner kommen
-
Online Marketing & SEOvor 2 Monaten
So baut Googles NotebookLM aus deinen Notizen KI‑Diashows