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

Kfz-Branche erwartet für 2026 rund 700.000 Neuverkäufe von Elektroautos


Der Verband der Automobilindustrie (VDA) und der Zentralverband Deutsches Kraftfahrzeuggewerbe (ZDK) rechnen mit einer Belebung der Verkäufe batterieelektrischer Autos (BEV), bei Plug-in-Hybriden (PHEV) hingegen mit einem Rückgang. Vorläufig soll sich dieser Zuwachs nach den Erwartungen des VDA auf einem Niveau von Gesamtzulassungen noch deutlich unterhalb des Einbruchs der Verkaufszahlen durch Covid-19 abspielen.

Weiterlesen nach der Anzeige

Der VDA erwartet 2026 die Neuzulassung von rund 693.000 neuen BEV in Deutschland, rund 30 Prozent mehr als voraussichtlich 2025 insgesamt. Der Verband der Internationalen Kraftfahrzeughersteller (VDIK) hält es für möglich, dass rund 740.000 BEV neu zugelassen werden. Das wären fast 30 Prozent mehr BEV als im laufenden Jahr und rund ein Viertel aller Neuzulassungen. Inklusive PHEV kommt der VDA in seiner Prognose auf knapp eine Million Neuzulassungen von Fahrzeugen mit Stromspeicher für den Antrieb. Der ZDK ist etwas optimistischer und erwartet sogar 1,1 Millionen Neuverkäufe von BEV und PHEV für 2026. Laut VDA könnten Neuzulassungen von PHEV 2026 um fünf Prozent auf 286.000 leicht sinken.

Bei den BEV liegt die Prognose des VDA etwas unter der des ZDK, der 2026 rund 740.000 neue BEV im kommenden Jahr für möglich hält. Vorausgesetzt hat der ZDK die von der Bundesregierung angekündigte Förderung für private E-Autos, eine Bedingung, die auch Grundlage für die Einschätzungen des VDA ist. Die Koalition hatte sich vergangene Woche auf die Wiedereinführung einer Förderung für den privaten Kauf von BEV geeinigt. Es könnte den Plänen zufolge für Haushalte mit einem zu versteuernden Jahreseinkommen von bis zu 80.000 Euro geben, je Kind 5000 Euro mehr. Es solle eine Basisförderung von 3000 Euro festgelegt werden, die für die ersten beiden Kinder um je 500 Euro steige. Der Beginn der Förderung steht aber noch nicht fest.

Für den Gesamtmarkt sieht der VDA kaum Änderungen und rechnet für das kommende Jahr mit insgesamt 2,9 Millionen Pkw-Neuzulassungen aller Antriebsarten, rund zwei Prozent mehr als im laufenden Jahr. Der ZDK sieht im kommenden Jahr einen Anstieg der Pkw-Neuzulassungen um 3,5 bis vier Prozent von rund 2,85 Millionen im Laufenden auf rund 2,95 Millionen im kommenden Jahr voraus. Vom bisherigen Rekordjahr 2019 sind diese Zahlen aber weiterhin deutlich entfernt. Vor der Covid-19-Pandemie wurden fast 20 Prozent mehr Neuwagen zugelassen als die Verbände für 2026 veranschlagen.

Als Gründe nennt der ZDK „breitere E-Modellpaletten im Klein- und Kompaktwagensegment, höhere Reichweiten, sinkende Preisunterschiede zwischen Verbrennern und E-Fahrzeugen sowie den fortschreitenden Ausbau der Ladeinfrastruktur“. In der Hoffnung auf eine bereits ab Beginn des Jahres greifende Förderung für Elektroautos nennt er 2026 das „Jahr, in dem die Elektromobilität im Markt wirklich ankommen kann, wenn die Weichen richtig gestellt werden“.

Weiterlesen nach der Anzeige

Laut ZDK drohe ohne diese politischen Entscheidungen in wenigen Jahren ein um 70 bis 80 Cent höherer Kraftstoffpreis, weil ohne substanzielle Steigerung der Elektroautoverkäufe der CO₂-Preis auf bis zu 300 Euro je Tonne steigen könnte. „Mobilität würde zur sozialen Frage, weil Menschen ohne Zugang zu Neuwagen von bezahlbarer Automobilität ausgeschlossen würden“.

Mehr zum Thema E-Mobilität


(fpi)



Source link

Weiterlesen

Künstliche Intelligenz

Buy now, pay later: Wie Sie Einkäufe später bezahlen können


Das neue Smartphone wirkt verlockend, wäre da nur nicht der eigene Kontostand. Denn der spricht ganz klar gegen den Kauf. Aber als ob es der Händler geahnt hätte: Neben der Einmalzahlung bietet er auch eine Zahlung auf Raten oder zu einem späteren Zeitpunkt an. Buy now, pay later (BNPL) – so das fast schon uneigennützig wirkende Angebot. So können Sie Ihr Konsumverlangen befriedigen, obwohl es die eigene wirtschaftliche Situation vielleicht gar nicht hergibt.


Update

05.12.2025,

11:02

Uhr

Wir haben alle Konditionen auf den Stand vom 4. Dezember 2025 aktualisiert sowie die bevorstehenden Änderungen bezüglich Amazons Ratenzahlungsoptionen eingefügt.

Ratenzahlung oder Zahlungsziele mit einer Frist von einem Monat oder länger sind keine neue Erfindung. Schon vor Jahrzehnten boten Versandhäuser wie Neckermann, Otto und Quelle derartige Optionen. Im (Online-)Handel der Gegenwart bieten Händler meist in Zusammenarbeit mit Zahlungsdienstleistern wie Klarna und Paypal solche BNPL-Varianten an. Allerdings haben inzwischen auch Banken erkannt, dass man auf diesem Wege zusätzliche Einnahmen generieren kann. Denn die großzügigen Zahlungsziele sind in vielen Fällen mit Gebühren oder Zinsen verbunden.

  • Hinter dem Begriff „Buy now, pay later“ können sich verschiedene Zahlungsmöglichkeiten verbergen, etwa ein 14-tägiges Zahlungsziel oder 24 Monatsraten.
  • Viele „Buy now, pay later“-Anbieter bieten zumindest eine Zahlungsoption, bei der keine Gebühren oder Zinsen anfallen.
  • Einige Banken ermöglichen, bereits getätigte Umsätze nachträglich in eine Ratenzahlung umzuwandeln.
  • In vielen Fällen verlangen die Anbieter Zinssätze, die über den denen von Verbraucher- oder Dispositionskrediten liegen.

Wir zeigen anhand mehrerer Beispiele, welche „Buy now, pay later“-Möglichkeiten es neben Klarna und Paypal gibt und wie Sie für selbst bereits erfolgte Käufe eine spätere Bezahlung vereinbaren können. Zudem gehen wir auf die Kosten ein, mit denen Sie bei den jeweiligen Anbietern rechnen müssen.


Das war die Leseprobe unseres heise-Plus-Artikels „Buy now, pay later: Wie Sie Einkäufe später bezahlen können“.
Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.



Source link

Weiterlesen

Künstliche Intelligenz

Auswandern nach Polen: Was ITler verdienen, Lebenshaltungskosten und Steuern


Wenn deutsche IT-Experten auswandern, dann meist in Länder mit höheren Gehältern wie die USA. Doch zwischen undurchsichtiger Außenpolitik, explodierenden Visums-Kosten und Sorgen vor Einreisekontrollen fühlt sich manch einer unwohl. Vielleicht ist es da doch einfacher, innerhalb der EU umzuziehen … zum Beispiel nach Polen!

Deutschlands Nachbar im Osten hat sich längst von einem Aus- zu einem Einwanderungsland gewandelt. Das liegt auch am Wirtschaftswachstum und einem boomenden Technologiesektor, in den Konzerne wie Google, Intel und Microsoft Milliarden investieren. Das macht den Jobmarkt attraktiv, denn auch in Polen fehlen IT-Fachkräfte.

  • Investitionen von Microsoft, Google und Intel, Start-ups wie Elevenlabs und eine Gamesindustrie rund um CD Projekt Red machen den polnischen Arbeitsmarkt auch für IT-Experten interessant.
  • Mit konkurrenzfähigen Gehältern bei niedrigen Steuern und Lebenshaltungskosten kann der Blick über Deutschlands östliche Grenze lohnen.
  • Auswanderer müssen sich unter anderem aber auch auf eine Sprachbarriere gefasst machen.

Wir zeigen, ob sich ein Umzug für Jobs und niedrige Lebenshaltungskosten lohnt. Dafür haben wir uns nicht nur die bürokratischen Hürden angeschaut, sondern auch mit einem deutschen Entwickler beim polnischen Computerspieleentwickler CD Projekt Red („The Witcher“, „Cyberpunk 2077“) über seine persönlichen Erfahrungen mit Arbeitskultur und Lebensqualität gesprochen.


Das war die Leseprobe unseres heise-Plus-Artikels „Auswandern nach Polen: Was ITler verdienen, Lebenshaltungskosten und Steuern“.
Mit einem heise-Plus-Abo können Sie den ganzen Artikel lesen.



Source link

Weiterlesen

Beliebt