2016-08-03 32 views
0

Ich habe TBB flow graph conditional execution gelesen und habe ein etwas anderes Problem.TBB Flow Graph bedingte Ausführung UND mehrere Ein- und Ausgänge

Ist es möglich, einen Knoten mit mehreren Eingängen und mehreren Ausgängen AND zu erstellen, um die Ausführung durch eine bedingte Variable zu steuern? Vielleicht ohne hässliche Würfe.

Ich habe ein einfaches Beispiel hinzugefügt, wie ich das Diagramm entwerfen möchte. Wie ist der beste Weg, um es mit TBB Flow Graph laufen zu lassen?

  1. start_node sendet ein start_msg zu some_node

  2. wenn start_msg leer ist, some_node sendet ein continue_msg-end_node, sonst some_node ein continue_msg an sich selbst sendet und eine data_msg zu end_node

  3. wenn continue_msg ist empfangen von some_node, vorherige start_msg wird überprüft wenn es leer ist, dann wird ein continue_msg an end_node gesendet, sonst wird ein data_msg gesendet.

         +--continue_msg--+ 
            |    | 
            +-----+ +-----+ 
              | | 
              | | +----data_msg---+ 
              v |/    \ 
    start_node --start_msg--> some_node     end_node 
                \    /
                +--continue_msg--+ 
    

Ein Problem bei der ich zu tun habe: Ich kann nicht sagen, wie viele gute Elemente innerhalb von start_msg sind, ist auch die Größe bekannt ist (sagen wir mal start_msg ein tbb::concurrent_vector<T> hält Wenn some_node schlecht findet. Element, wird es ignoriert und some_node ist ein continue_msg an sich selbst sendet.

Antwort

1

es sieht aus wie die source_node können in Ihrem Algorithmus verwendet werden. source_node können so viele Meldungen erzeugen, wie Sie benötigen. so kann der Algorithmus ein wenig nachgearbeitet werden :

source_node -> ... -> end_node 

Warum brauchen Sie continue_msg eine an die end_node gesendet werden? Um die letzte Nachricht zu markieren? Vielleicht können Sie eine std::pair<T,bool> verwenden, wobei das erste Element Daten und das zweite Element eine Angabe der letzten Nachricht ist.

Der Körper der source_node findet das gültige Element in tbb::concurrent_vector<T>, eine neue Nachricht make_pair(Data, false) und gibt true für jeden Körper Aufruf erzeugt. Wenn das letzte Element aus dem Container extrahiert wird, erstellt es make_pair(Data, true) und gibt false als Hinweis auf das letzte Element zurück.

Leider kenne ich den ursprünglichen Algorithmus nicht und mein Vorschlag kann unpassend sein. Könnten Sie bitte mehr Details angeben, wenn es nicht Ihren Bedürfnissen entspricht?