Anfängerfragen zu Multithreading



  • Hallo zusammen,

    ich bin Laie und programmiere viel mit OpenCV und neuerdings auch GUIs mit Qt.
    Damit die GUI immer ansprechbar bleibt bekommt die Bildverarbeitung bisher zwei eigene Threads. Der erste "sammelt" die Bilder und verarbeitet diese vor. Anschließend kommen diese Bilder dann zum zweiten Thread, wo die eigentliche Bildverarbeitung stattfindet.
    Das funktioniert auch alles gut, doch ich habe da so einige offene Fragen 😉

    Grundsätzlich wäre es natürlich klug eine entsprechende Grafikkarte zu nutzen, auf der ich direkt meine Bildverarbeitung durchführen könnte. Allerdings wäre die Anwendung dann nicht mehr wirklich portabel, da nicht jeder Rechner über eine geeignete GPU verfügt.

    Im Moment schreibe ich ein Programm, bei dem exakt dieselben Berechnungen für verschiedene Bildausschnitte durchgeführt werden sollen.
    Das alles in einem Thread durchzuführen ist schon nicht mehr so flott und da kommt natürlich der Gedanke nach mehr Parallelisierung.

    Nun ist es aber so, dass meine Verarbeitungsklasse nochmal Objekte für 5 andere Klassen erzeugt und diese besitzen teilweise ebenfalls wieder Objekte die aus anderen Klassen erzeugt werden. Ich bin mir sehr sicher, dass meine Klassen momentan nicht Threadsicher sind, aber ich weiß ehrlich gesagt auch nicht wirklich, wann eine Klasse Threadsicher ist.

    Ich weiß was ein Mutex ist, nur mir ist überhaupt nicht klar, wann eine Variable gefährtdet ist, so dass ich einen Mutex einsetzen müsste.
    Auch werden in den genutzten Klassen teilweise lokale Variablen in einzelenen Funktionen eingesetzt. Ist das unkritisch oder würde ich genau hier einen Mutex brauchen? Oder sollte man alle lokalen Variablen durch Klassenvariablen ersetzten?

    Grundsätzlich stellt sich mir die Frage, wie viele Threads machen eigentlich Sinn?
    Wenn ich mal in Taskmanager von Windows sehe, werden mir über 1000 Threads angezeigt.

    Für viele von euch sind meine Fragen vielleicht trivial.
    Ich habe allerdings noch keine Antworten parat und das Kapitel zu Multithreading in meinem C++ Buch ist leider ein Witz 😉

    Daher freue ich mich über eure Antworten. 🙂

    Viele Dank für die Hilfe 🙂



  • Ein normales c++buch kann das nicht leisten, schon wegen der Menge an papier, die hinzukäme. http://www.manning.com/williams/ ist ca. 500 Seiten dick - aber das wäre evtl das richtige für dich. Anthony Williams hat an der c++ thread lib mitgearbeitet



  • Ich weiß was ein Mutex ist, nur mir ist überhaupt nicht klar, wann eine Variable gefährtdet ist, so dass ich einen Mutex einsetzen müsste.

    Ein Variable ist 'gefährdet' wenn zwei Threads gleichzeitig lesend/schreibend darauf zugreifen. Also keine lokalen sondern nur Klassen/globale Variablen.



  • coder777 schrieb:

    Ein Variable ist 'gefährdet' wenn zwei Threads gleichzeitig lesend/schreibend darauf zugreifen.

    Vielleicht etwas präziser: wenn mehr als ein Thread und mindestens einer davon schreibend darauf zugreifen. Wenn alle nur lesen gibts kein Problem. Sorry für die Korinthenkackerei 😃

    Finnegan



  • Am einfachsten finde ich es, wenn man gar keinen geteilten Zustaende mehr hat und alle informationen ueber message passing zuteilt. Eine library kann ich dir dazu aber auch nicht nennen. Ich habe mal etwas aehnliches auf basis von boost selbstgeschrieben, wobei mir die verwendete Datenstruktur aber zu komplex und zu low-level gleichzeitig war.



  • Hallo zusammen,

    vielen Dank für die ganzen Antworten. 🙂

    Nun bin ich schon eine Ecke schlauer.

    Das genannte Buch werde mich mir nächste Woche mal ausleihen.

    Ansonsten werde ich einfach mal probieren mein Programm umzustricken und hoffe, dass keine Fehler auftauchen. ^^

    Message Passing meint sowas wie Signale und Slots in Qt, oder?



  • Du kannst auch mal in TBB reinschauen



  • @Marthog
    Und weil es keine Libs gibt die du empfehlen kannst, und dein selbststrick Versuch auch viel zu kompliziert geendet hat, nennst du es einfach?
    Das musst du mir jetzt nochmal erklären.



  • Grundsätzlich wäre es natürlich klug eine entsprechende Grafikkarte zu nutzen, auf der ich direkt meine Bildverarbeitung durchführen könnte. Allerdings wäre die Anwendung dann nicht mehr wirklich portabel, da nicht jeder Rechner über eine geeignete GPU verfügt.

    Generell, es gibt libraries und Sprachen die portabel sind.
    wenn du OpenGL und GLSL verwendest, würde das auf Windows, Linux, Mac laufen.
    Wenn du dich in Opengl an die ES Profile hälst, kämen auch noch die mobilen Plattformen hinzu (android, windows phone, Raspi's ....)
    Also am Meisten unterscheiden sich da die plattformen nicht am Umfang der sprache, sondern an der Leistungsfähigkeit und paar "Features" (Texturformate etc)

    Glaub aber kaum das du nen "komplettes" Bildverarbeitungsprogramm in basis c++ + OpenGl + shader schreiben willst / kannst.
    Aber die Grafikroutinen bekommst plattformunabhaengig hin ... eher das problem ist eingabe, Fenster und Apllikationsmanagment ^^

    Ciao ...



  • The Best Synchronization Is No Synchronization: Alternatives to semaphores, mutexes, and CRITICAL_SECTIONs

    http://www.flounder.com/no_synchronization.htm

    Bin damit immer gut gefahren, ist aber MFC.
    Bin da auf der Seite von Marthog.

    Daß hustbaer eigentlich fast immer nur negativ (nicht immer konstruktiv) rüber kommt ist etwas an dem er arbeiten sollte.



  • hustbaer schrieb:

    @Marthog
    Und weil es keine Libs gibt die du empfehlen kannst, und dein selbststrick Versuch auch viel zu kompliziert geendet hat, nennst du es einfach?
    Das musst du mir jetzt nochmal erklären.

    Mein selbstgemachtes war schwer, weil ich es selbst machen und mich dazu in boost.lockfree einarbeiten musste. Danach ging es, auch wenn es nicht generisch und nicht genug gekapselt war.
    Rusts standardlibrary ist ziemlich gut und das sollte sich auch sehr aehnlich in C++ umsetzen lassen. Die Frage ist nur, welche library den richtigen tradeoff aus benutzbarkeit und sicherheit hinbekommt und da kenne ich mich nicht aus.


Anmelden zum Antworten