Multithread Applikation: Programmdesign



  • Hallo Senior Devs,

    wie sieht das richtige Klassendesign für eine Multithreaded Applikation aus? Ich muss auf einem Raspberry 2 Device den Programmstatus via LEDs ausgeben, RS232 Verbindungen überwachen, einen NFC Reader pollen und je nach Strategie Daten von RS232, NFC oder Raspberry Pi via Socket an einen Server schicken müssen. Das irgendwie hinzubekommen sollte kein Problem für mich sein. Nur frage ich mich, wie ich richtig mit mehreren Threads arbeite. Welche Datenstruktur ich für die Threads nehme? Wie übergebe ich Datenstrukturen von Thread zu Thread richtig? Wie reagiere ich im Main Thread richtig auf Events in einem "Sub" Thread. Und vor allem wie gestalte ich das ganze sicher ohne Deadlocks oder ähnliches zu implementieren.

    Viele Grüße
    Marco



  • Mit der Antwort kann man Bücher füllen. Kauf dir eines.



  • Mit der Queue-Datenstruktur.😂



  • Eine pauschale Antwort gibt es da leider nicht.

    Grundlegend wäre es ein Ansatz einen Thread jeweils mit einer Queue zu paaren und diese Queue in irgendeiner Form thread_safe zu machen. Der einfachste Weg wäre, eine CritSect darum zu basteln ( bei std::queue sind es die Funktionen "push" und "pop" du absichern musst.

    Der Thread tut dann im Idealfall nichts weiter als den Inhalt dieser Queue auszulesen. Du entfernst alle Querverbindungen, die in irgendeiner Weise die Queue umgehen würden. D.h. alles läuft über eine sichere Queue. Einfache Stati kannst du prinzipiell aber auch über "std::atomic" schreiben und lesen, damit du nicht jeden Furz extra über die Queue schleifen musst.

    Dann hast du natürlich noch TimerEvents, die du entweder über die Queue ziehst, oder extra für diese TimerEvents noch eine zweite Queue ( pro Thread ) anlegst, um diese Timer ( wenn sie denn wichtig sind ) von der restlichen Kommunikation zu trennen. Deadlocks verhinderst du z.B. in dem du Abhängigkeiten abbaust. D.h. ein Status "A wartet auf B und B wartet auf A" solltest du verhindern.

    Aber wie die anderen schon schrieben: es gibt tausende Ansätze und verschiedenste Möglichkeiten. Die "beste Lösung" kann bei jeder Aufgabe eine andere sein, daher lässt sich kein Patentrezept nennen, ohne Kenntnis deiner Fähigkeiten und deiner Aufgabe.



  • Danke für die Antworten. Die Aufgabe wurde gelöst. In den einzelnen Threads laufen Schleifen und in denen wird das Verhalten nebenläufig ausgeführt. Kritische Schreib und Lesesituationen werden per Mutex gesichert. Spinlocks sind aufgrund der Maschinenarchitektur ausgeschieden. Danke für eure Beiträge.