synchronisierte Nachrichten Queue



  • Hallo,

    ich stehe aktuell vor dem Problem, daß ich eine asynchrone Nachrichten-basierte Threadkommunication in ANSI-C machen möchte und ich sonst komfortable C++ oder JAVA Frameworks gewohnt bin.

    Ich habe im Kopf einen Haupthread, der nicht blockierend Nachrichten absetzten soll, die dann an einen von N verschiedene Worker-Threads verteilt werden sollen - und der jeweilige Thread weiß davon nichts, entweder schläft er und soll aufwachen oder er holt sie sich ab wenn er Zeit hat. Die N-Worker Threads überwachen alle verschiedene Ressourcen und sind je nach Gerät tw. lange mit dieser beschäftigt und wollen dabei nicht unterbrochen werden.

    Ich habe mir jetzt dazwischen irgendeine Form von Nachrichtenverteiler Thread überlegt, aber beim Austüfteln dessen Funktionsweise drohe ich mich etwas zu verzetteln.

    Deswegen: gibt es vielleicht für ANSI-C ein derartiges Designbeispiel, wie man sowas konstruieren könnte? Wie würdet ihr das machen? Gibt es evtl. auch eine freie Bibliothek, die mir ähnliches bietet? (wobei letzteres wohl nicht funktionieren wird: kein POSIX System, kein Windows)

    Jemand Ideen? Danke 🙂



  • ansi c kennt keine threads.
    bei threads wirst du wohl ein os wählen, oder dich nach cross-libraries umsehen müssen.
    ansonsten ist es prinzipiell ja kein problem, mehrere threads von einem 'hauptthread' aus zu starten.



  • am besten mit einer queue (die stl::queue nachbauen), allerdings threadsafe,
    mit einer art critical_section / mutex (kommt auf die platform an).

    sowas:

    hauptthread()
    {
        while (1)
        {
            push_queue(pQueue, msg);
        }
    }
    
    thread() // mehrmals parallel gestartet z.b.
    {
        while (1)
        {
            do_something_usefully();
    
            EnterCritical(&crit);
    
            bool avail = !empty_queue(pQueue);
            MSG msg;
            if (avail)
                msg = pop_queue(pQueue);
    
            LeaveCritical(&crit);
    
            if (avail)
            {
                // we got a message
                handle_message(&msg);
            }
        }
    }
    

    so in der art.



  • Ja, irgendwie in C eine threadsafe Q zu realisieren, habe ich mir auch überlegt. Meine Gedanken bei dieser Q gingen in die Richtung das Anhängen und Entnehmen irgendwie als getrennte kritische Aktionen zu machen, die nur beide betreten werden müssen, wenn 0 oder 1 Element in der Q sind. Sonst müßt man doch zeitgleich anhängen und entnehmen können, bzw. jeweils ein Thread das gleichzeitig dürfen.

    Das dieser Thread auch die Zustellung übernehmen soll, müßte man für jeden Empfangsthread eine Q vorhalten und der Nachrichten Verteiler Thread müßte die dann entsprechend einsortieren.

    Das OS bietet mir synchronisierte Threadkommunikation, aber auch nur naja "synchron". Asynchrone Threadkommunikation geht nur über events, die über keine Nutzdaten verfügen. Ich habe überlegt aus beiden Modellen irgendwie was Asynchrones zu basteln, wurde damit aber auch nicht glücklich, weil dies durch viele Empfangsthreads komplizierter wird.


Anmelden zum Antworten