2014-11-19 11 views
5

Ich habe einen Thread-Pool besteht aus 4 Threads: t1, t2, t3 und t4. Sie laufen gleichzeitig, aber die Eingabe von t3 und t4 hängt von der Ausgabe von t2 ab. Wie sollte ich die Nachrichtenwarteschlange implementieren, damit nach t2 die Ausgabedaten zur Verarbeitung an t3 und t4 gesendet werden? Ich habe versucht, die Nachrichtenwarteschlange mit Sperrmechanismus zu implementieren, aber es scheint, dass das Sperren ziemlich teuer ist. Gibt es einen Lock-Free-Mechanismus, der Daten zwischen Threads weitergibt? Ich verwende boost :: thread in Visual Studio 2010.C++ - Übergabe von Daten zwischen Threads

+1

Lernen Sie von folgendem Link: http://stackoverflow.com/questions/20595760/c-communication-between-threads –

Antwort

3

Boost hat eine sperrfreie Warteschlange: http://www.boost.org/doc/libs/1_56_0/doc/html/lockfree.html.

+0

Hallo Tomo, für meine t3 und t4 müssen die Ausgabedaten von t2 erhalten. Also frage ich mich, wer die Daten aus der Nachrichtenwarteschlange herausnehmen wird? Sollte es t2 sein, weil wir nicht sicher sind, ob t3 oder t4 zuerst fertig werden? Ich meine, wann immer t2 neue Daten in die Warteschlange stellt, wird es auch die Warteschlange aus der Warteschlange nehmen. – Bent

+0

Ja, t2 sollte seine Ausgabe in die Warteschlange stellen. T3 und t4 sollten regelmäßig prüfen, ob sich in der Warteschlange etwas befindet, das verarbeitet werden soll. Angenommen, t3 und t4 haben andere Dinge zu tun. Wenn nicht (d. H. Ihre einzige Aufgabe ist es, auf die Ausgabe von t2 zu warten und sie zu verarbeiten), vergessen Sie blockierungsfreie Warteschlangen und gehen Sie einfach mit einer Sperrlösung. Wenn die Threads trotzdem warten müssen, sollten die Kosten für das Sperren nicht Ihr Problem sein. – Tomo

1

Sie können betrachten. Es bietet eine breite Palette von parallelen Konzepten einschließlich concurrent_queue, concurrent_bounded_queue (zum Warten), pipeline, flow::graph. Die ersten beiden sind auch verfügbar in innerhalb MS VS 2010

+0

Hallo Anton, danke fürs antworten! Weil mein Projekt momentan Boost-Lib verwendet, werde ich mich mehr auf Boost konzentrieren. Aber ich werde auch auf TBB schauen, wenn ich keine Lösung finden kann. :)) – Bent

Verwandte Themen