Parallele Pipeline in C++



  • Wie realisiere ich möglichst einfach Pipelines, in der verschiedene Schritte eines Prozesses parallel abgearbeitet werden?
    Als Beispiel ein Thread, der Dateien von der Festplatte liest, 1-2 Threads, in denen die Daten dekomprimiert werden und 2-3 weitere Threads, welche die dekomprimierten Daten auswerten.
    Welche Bibliotheken und Techniken sind empfehlenswert?



  • Ich würde es folgends realisieren:
    Jeder Teil der Pipeline würde in einer (Endlos-)Schleife versuchen seine Arbeit zu tun und Resultate in eine mutex-geschützte Queue abzulegen (welche in ihrer Größe eingeschränkt wäre, um einen Überfluss zu vermeiden).
    Wäre die Queue voll, müsste halt gewartet werden, bis der nächste Teil der Pipeline einen Wert entnimmt. Dieser wiederrum müsste, wenn die Queue leer ist, warten, bis etwas reinkommt.



  • Alles klar, danke. Habe mal kurz etwas zusammengebastelt:

    PipelineStage<File,MemoryStream> fileReadingStage(reader,10);
      PipelineStage<MemoryStream,MemoryStream> decompressionStage(fileReadingStage,decompressor,10);
      PipelineStage<MemoryStream,int> analyzeStage(decompressionStage,analyzer,0);
      PipelineStage<MemoryStream,int> analyzeStage2(decompressionStage,analyzer,0);
    
      auto files=recursivelyListDirectoryContents(inputDir,DCF_FILES,"*.lzma");
      fileReadingStage.getInputQueue()->assign(files.begin(),files.end());
    
      fileReadingStage.start();
      decompressionStage.start();
      analyzeStage.start();
      analyzeStage2.start();
    
      while (analyzeStage.getOutputQueue()->size()+analyzeStage2.getOutputQueue()->size()<files.size())
      {
        sleepMilliseconds(1000);
      }
    

    Das braucht wohl noch eine weitere Klasse, welche die Stages organisiert, aber im Prinzip funktioniert das für den aktuellen Fall gut und ist noch übersichtlich.
    Allerdingt muss ich die Anzahl der Threads selbst festlegen. Das ist hier zwar kein Problem, da ich weiß, da die letzte Phase mit Abstand am längsten dauert, aber das muss nicht immer so vorhersagbar sein. Darum wäre mir eine Lösung recht, welche die Last automatisch möglichst optimal auf Threads verteilt. Das selbst zu schreiben, ist wahrscheinlich etwas aufwändig, deswegen wäre mir eine Bibliothek recht willkommen.
    Ist das z.B. mit TBB einfach realisierbar? Gibt es andere?



  • Geht es nur um threads ?

    und hasst du eine Queue für den Mainthread zur verfügung?
    Ich hab sowas mal gebaut mittels QT und Signale/Slots (nutzen die QEventQueue).
    Erspart man sich viel Arbeit 🙂
    Also Abstrakte Jobs als QThread Instanzen, die von einem Jobmanager verwaltet werden.
    Ich hatte auch Abhaengigkeitsverwaltung drinne, also das nen Job erst nach nem anderen ausgefuehrt wurde, und wenn der vorherige schieflief, der Job auch "geskippt" wurde. Der Jobmanager ueberwachte auch die max. Anzahl der Laufenden Jobs (aka threadpool).

    Geht natürlich auch ohne QT, dann bracust aber irgendwoher ne threadsichere Eventloop 🙂

    Ciao ...


Anmelden zum Antworten