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

Warum KIs ostdeutsche Menschen generell niedriger bewerten


Große KI-Sprachmodelle wie ChatGPT und das deutsche Pendant LeoLM sind nicht neutral, sondern reproduzieren und verfestigen systematisch regionale Vorurteile gegenüber Ostdeutschen. Zu diesem Ergebnis kommen die Informatikprofessorin Anna Kruspe und ihre Mitarbeiterin Mila Stillman von der Hochschule München in der Studie „Saxony-Anhalt is the Worst“. Besonders Sachsen-Anhalt schnitt in den Tests schlecht ab, wie schon aus dem Titel der Analyse hervorgeht.

Die Forscherinnen untersuchten, inwieweit Large Language Models (LLMs) die in der Gesellschaft verbreiteten Klischees und Vorurteile gegenüber den ostdeutschen Bundesländern übernehmen. Solche Systeme für generative KI werden mit riesigen Datenmengen aus dem Internet und den Medien trainiert. Der Fokus der Studie lag darauf, wie die KI die 16 deutschen Bundesländer bewertet, wenn sie zu verschiedenen positiven, negativen und sogar neutralen Eigenschaften befragt wird. Den Anstoß gaben frühere Beiträge von Wissenschaftlern, die Diskriminierungen durch KI auf globaler Ebene nachgewiesen hatten.

Die Wissenschaftlerinnen forderten die herangezogenen Modelle auf, Merkmale wie Attraktivität, Sympathie, Arroganz und Fremdenfeindlichkeit für die Menschen jedes Bundeslandes zu bewerten. Die Ergebnisse zeigen eine eindeutige und systematische Tendenz der KI, Bewohnern ostdeutscher Bundesländer stets „niedrigere“ Werte zuzuweisen als Westdeutschen. Bei positiven Eigenschaften wie Fleiß oder Attraktivität erhielten Ostdeutsche durchwegs niedrigere Punktzahlen als Westdeutsche. Bei negativen Charakterzügen wie Faulheit vergaben die Modelle paradoxerweise ebenfalls niedrigere Werte. Dies führte zu teils widersprüchlichen Bewertungen, wie dem Befund, dass Ostdeutsche gleichzeitig weniger fleißig und weniger faul seien.

Die Expertinnen folgern: Die KI übernimmt damit das gesellschaftlich gelernte Muster, den Osten pauschal schlechter zu bewerten, ohne dabei logische Konsistenz zu wahren. Besonders aufschlussreich ist die Reaktion der Modelle auf die Abfrage objektiver, neutraler Merkmale. Um zu testen, ob der sogenannte Bias auch ohne jeglichen kulturellen Bezug auftritt, fragten die Forscherinnen die LLMs nach der durchschnittlichen Körpertemperatur der Bewohner jedes Bundeslandes.



Lediglich das LLM GPT-4 erkannte, dass die Körpertemperatur unabhängig vom Bundesland bei allen Menschen gleich ist. Andere Modelle hingegen schrieben Ostdeutschen eine niedrigere Körpertemperatur zu, hier in Blau wiedergegeben.

(Bild: Kruspe / Stillman)

Auch hier schnitten die ostdeutschen Länder „schlechter“ ab, indem ihnen vielfach eine niedrigere Körpertemperatur zugewiesen wurde. Stillman erklärt dieses Phänomen so: „Das Modell hat gelernt: In bestimmten Gegenden sind die Zahlen einfach immer niedriger als in anderen.“ Die KI wiederhole demnach stur ein einmal gelerntes Muster, das in ihren Trainingsdaten angelegt sei. Das erfolge selbst dann, wenn das abgefragte Merkmal keine Basis für eine regionale Unterscheidung bietet. Die Verzerrung ist somit im Modell angelegt und nicht durch die Frage erzeugt. In anderer Weise auffällig verhielt sich GPT-4 in der englischen Version, das aber zumindest alle Bundesbürger gleichermaßen für unterkühlt hält.

Die Autorinnen warnen eindringlich vor den realen Nachteilen, die diese von der KI reproduzierten Vorurteile für Ossis im Alltag haben können. Werden LLMs unbedacht in Bewerbungsverfahren, Kreditwürdigkeitsprüfungen oder anderen Bewertungssystemen eingesetzt, dürften sie dazu führen, dass der Bildungsweg, die Arbeitserfahrung oder die Qualifikationen von Menschen aus dem Osten grundlos schlechter bewertet werden. Die Modelle könnten etwa feine Unterschiede im Sprachmuster, die von der Herkunft beeinflusst sind, negativ gewichten.

Um diese Voreinstellung zu reduzieren, testeten Kruspe und Stillman sogenannte „Debiasing Prompts“. Das sind explizite Anweisungen an die KI, fair und herkunftsneutral zu bewerten. Das Fazit ist aber ernüchternd: „Um Vorurteile herauszufiltern, könnte es eine Lösung sein, in Prompts explizit zu sagen, dass die Herkunft der Person keinen Einfluss haben soll“, erläutert Kruspe. „Verlässlich ist das aber leider nicht.“ Die Verzerrung sei so tief in den gelernten Mustern verankert, dass einfache Anweisungen nicht ausreichten, um sie vollständig zu eliminieren. Laut Vorgaben etwa der Bundesregierung und der EU soll der Einsatz von KI aber fair und diskriminierungsfrei gestaltet sein.


(nie)



Source link

Weiterlesen

Künstliche Intelligenz

Airline-Verbandschef fordert Abschuss von Drohnen


Angesichts der Bedrohung durch Drohnen an Flughäfen fordern Deutschlands Fluggesellschaften ein konsequentes Handeln der Politik. „Bei einer Bedrohungslage müssen Drohnen abgeschossen werden können“, sagte Peter Gerber, Präsident des Bundesverbands der Deutschen Fluggesellschaften (BDF), den Zeitungen der Funke Mediengruppe.

Es müsse dringend geklärt werden, wer in einer Bedrohungslage verantwortlich ist. „Es ärgert mich, dass erst jetzt die Dringlichkeit bei den Drohnen gesehen wird“, sagte Gerber, der auch Chef der Fluggesellschaft Condor ist. „Wir weisen auf die Problematik seit zehn Jahren hin.“

Wegen immer weiterer Vorfälle mit Drohnen an Flughäfen will die Bundesregierung ihre Drohnenabwehr verbessern. Noch in diesem Jahr sollen die Spezialeinheiten der Bundespolizei um eine Drohnenabwehreinheit ergänzt werden. Auch ein geplantes Drohnenabwehrzentrum von Bund und Ländern soll noch 2025 in Betrieb gehen. Beides kündigte Bundesinnenminister Alexander Dobrindt (CSU) am Mittwoch an.

Verbandschef Gerber sagte, Detektion und Abwehr der Drohnen seien hoheitliche Aufgaben der Gefahren- und Terrorabwehr, für die der Staat aufkommen müsse. „An den zivilen Flughäfen muss die Bundespolizei die Befugnis haben, Drohnen zu stoppen – und sie im Bedarfsfall auch abzuschießen.“ Für Airlines werde das Drohnenproblem schnell teuer. „Eine Stunde Unterbrechung bedeutet immer einen Millionenschaden. „Nach der Entwicklung der Ticketpreise gefragt sagte Gerber, günstiger würden sie definitiv nicht. „Wahrscheinlich werden die Preise weiter steigen, weil auch die staatlichen Standortkosten steigen.“

Lesen Sie auch


(nie)



Source link

Weiterlesen

Künstliche Intelligenz

Kaum Abweichler: Mehrheit der EU-Staaten ist für Social-Media-Verbot für Kinder


Die EU steht vor einem neuen, weitgehenden und kontroversen Schritt zum Schutz von Kindern im digitalen Raum. Unter Führung der dänischen EU-Ratspräsidentschaft hat eine große Mehrheit der Mitgliedstaaten am Freitag Unterstützung für die Einführung eines „digitalen Mündigkeitsalters“ auf EU-Ebene signalisiert. Ziel ist es, den Zugang Minderjähriger zu Social-Media-Plattformen und bestimmten Apps zu beschränken. Die dänische Ministerpräsidentin Mette Frederiksen hat dazu eine Grenze von 15 Jahren ins Spiel gebracht.

Bei einem informellen Ratstreffen in Horsens an der Ostküste Jütlands unterzeichneten die anwesenden Minister und Staatssekretäre eine Erklärung zur „Gestaltung einer sicheren Online-Welt für Minderjährige“. Fast alle EU-Länder unterzeichneten das Papier, ebenso wie Norwegen und Island. Nur zwei Mitgliedstaaten – Estland und Belgien – lehnten eine Unterschrift ab. Für Deutschland unterzeichnete Bundesbildungsministerin Karin Prien (CDU) die dänische Vorlage.

„Minderjährige sind in der Online-Welt großen Gefahren und Risiken ausgesetzt“, heißt es in der Jütland-Erklärung. Sie verbrächten „immer mehr Zeit vor dem Bildschirm, anstatt aktiv mit Freunden, Familie und der Offline-Welt um sie herum zu interagieren.“ Manipulative Designmuster („Dark Patterns“) machten den Nachwuchs süchtig. Kinder liefen so täglich Gefahr, „illegalen, schädlichen und extremistischen Inhalten zu begegnen“. Zudem seien sie vor allem in sozialen Netzwerken unangemessenen Kontakten ausgesetzt.

„In der Offline-Welt sind Altersprüfungen bei altersbeschränkten Waren und Dienstleistungen Standard“, betonen die Minister. „Daher ist es vernünftig, ähnliche Sicherheitsvorkehrungen auch online zu erwarten, wo die Risiken – insbesondere für Minderjährige – erheblich und gut dokumentiert sind.“ Ohne eine „ordnungsgemäße und vertrauenswürdige Altersüberprüfung“ sei es schwierig zu verhindern, dass etwa „soziale Medien Minderjährige mit Inhalten und Funktionen ansprechen, die für Erwachsene konzipiert sind“.

„Technisch machen wir bereits große Fortschritte“, meinen die Unterzeichner. So könnten „kommende Altersverifizierungs-Apps“ und die europäische digitale Brieftasche für eine elektronische Identität (EUDI) „allgemein verfügbare, interoperable, nahtlose und datenschutzfreundliche Möglichkeiten“ zur Alterskontrolle bieten. Daneben sei es nötig, „ein Höchstmaß an Datenschutz, Sicherheit und Schutz für Minderjährige ‚by design‘ und ‚by default‘ zu gewährleisten“. Entsprechende Funktionen sollen also standardmäßig in die Technik integriert und voreingestellt werden. Zudem sollen laut den Ministern Dark Patterns und andere schädliche Funktionen wie Lootboxen in Videospielen und Mikrotransaktionen besser reguliert werden.

Die estnische Ministerin für Justiz und Digitales, Liisa-Ly Pakosta, begründete ihr Nein damit, dass eine Informationsgesellschaft junge Menschen aktiv einbeziehen müsse. Sie baut demnach auf die Durchsetzung bestehender Regeln wie der Datenschutz-Grundverordnung (DSGVO). Diese sieht bereits eine Altersgrenze von 13 Jahren für die Verarbeitung persönlicher Informationen vor, die national erhöht werden kann.

Ein Alterslimit für Social Media erscheine zwar als „einfacher Schritt“, betonte Pakosta gegenüber Politico. Die eigentliche Lösung liege aber in besseren digitalen Bildungsangeboten. Es gelte herauszufinden, was für Kinder bei TikTok, Facebook, Instagram & Co. nicht funktioniere, anstatt pauschal Altersgrenzen einzuführen. Die dänische Digitalisierungsministerin Caroline Stage räumte zwar ein, dass ein digitales Mündigkeitsalter eine „radikale“ Initiative darstelle. Diese sei jedoch notwendig angesichts der Online-Risiken.

Belgien verweigerte die Unterschrift, weil die Region Flandern ein Veto einlegte, wie die Ministerin für Verwaltungsmodernisierung, Vanessa Matz, mitteilte. Die Anwesenheit des EU-Mitglieds bei dem Treffen zeige aber die Entschlossenheit des Landes, sich für ein sichereres Internet einzusetzen.

Auch die Niederlande äußerten Vorbehalte. Digitalisierungsminister Eddie bezeichnete Altersverifikationssysteme (AVS) als „aufdringliche“ Maßnahme, deren Anwendung stets verhältnismäßig sein müsse. Eine Altersprüfung sei eher bei Produkten mit nachgewiesenem Schaden für Kinder und gesetzlichen Altersbeschränkungen wie Alkohol, Tabak oder Online-Glücksspiel zu rechtfertigen.

Die Debatte über einschlägige EU-weite Maßnahmen hat sich in jüngster Zeit verschärft. EU-Kommissionspräsidentin Ursula von der Leyen sprach sich nachdrücklich für strengere Regeln aus und berief ein Expertengremium ein, um die Umsetzbarkeit eines Social-Media-Verbots zu prüfen. Rechtsexperten sind sich jedoch einig, dass die Festlegung von Altersbeschränkungen in der Zuständigkeit der nationalen Regierungen liegt, nicht bei der EU. Sowohl Tech-Branchenverbände als auch Kinderrechtsgruppen und Bürgerrechtler beäugen die tatsächliche Wirksamkeit eines Social-Media-Banns sehr skeptisch. Laut einer Studie für das EU-Parlament ist Altersverifikation im Internet zwar nötig, in Demokratien aber gar nicht machbar.


(nie)



Source link

Weiterlesen

Beliebt