2010-12-15 15 views
19

Ich arbeite mit einer mittelgroßen C++ - Code-Basis, die derzeit vollständig single-threaded ist. Die Zeit ist jedoch gekommen, Parallelität und Parallelität für Leistungssteigerungen zu verfolgen. Ich bin sehr an dem Parallelitätsmodell der Go-Programmiersprache von Google interessiert, mit sehr leichtgewichtigen Göroutinen und einem System zur Kommunikation von Kanälen.C++ - Bibliotheken, die Go-Goroutines oder Go-Channels implementieren?

Leider muss das Projekt aus einer Vielzahl von absolut gültigen Gründen in C++ bleiben. Meine Frage ist also: Gibt es eine C++ - Bibliothek, die das Go-Paradigma für Parallelität approximiert? Gibt es eine Approximation von Goroutines oder Go-Channels, die für C++ verfügbar sind? Mein Fallbackplan ist nur boost :: thread.

Bei der betreffenden Anwendung handelt es sich um eine proprietäre Langzeitsimulation für die Finanzprognosedomäne. Es ist normalerweise CPU-gebunden, wird aber auch bei IO blockiert, wenn neue Daten verfügbar werden. Viele der beteiligten Berechnungen sind nicht von vorherigen Ergebnissen abhängig und könnten ziemlich leicht parallel ausgeführt werden. Die Möglichkeit, die Anwendung in einem verteilten Kontext auszuführen, ist ein langfristiges Ziel, das jedoch nicht sofort gelöst werden muss.

+1

Ähnliche Fragen: http://stackoverflow.com/questions/2190231/looking-for-ac-or-clibrary-providing-a-funktionality-similar-to-google-gos-c – JimR

+0

Wie sind sie ähnlich ? –

+0

Sie müssen wirklich genauer auf Ihr Projekt eingehen. Verschiedene Arten von Anwendungen profitieren (oder nicht) von verschiedenen Threading-Modellen. Seien Sie das Koroutinen (die im Grunde genommen sind) oder Fäden; vielleicht ist ein Event-Modell besser geeignet oder eine der verschiedenen Actor-Bibliotheken. ** Beschreiben Sie Ihre Bewerbung **. – jer

Antwort

4

Wenn Sie vor allem Rechenaufgaben beschleunigen wollen, ist Intels TBB (Threading Building Blocks) eine bessere Option als Ihre eigene minderwertige Version von boost::thread.

+1

TBB aktualisiert sieht wie eine gute Option aus, aber ich würde es nur auswählen, wenn ich überzeugt bin, dass es keine gleichwertige Bibliothek gibt, die wir kostenlos nutzen könnten. –

+0

TBB * ist * kostenlos: Es gibt eine Version, die unter Apache Public License auf der verlinkten Site vertrieben wird. –

3

This question und in einer allgemeinen eine Google-Suche nach "C++ Koroutinen" sollten Sie etwas in der Nähe bekommen. Die Frage SO schlägt vor, Boost :: Coroutine zu versuchen.

Wenn es Ihnen nichts ausmacht, wickeln Sie C möglicherweise in der Lage sein, libtask zu versuchen. Was vor der Arbeit an Go von Russ Cox (einem der offiziellen Go-Entwickler) geschrieben wurde. Ich habe es nur in C benutzt, also weiß ich nicht, ob es anwendbar ist.

Go-Kanäle sind übrigens als Sperrwarteschlangen implementiert, so dass Sie möglicherweise einen ähnlichen Mechanismus mit regulären Threads einbauen können.

+0

Sieht aus, als ob libtask verschoben wurde. Sieht aus wie eine Gabel in GitHub gefunden werden kann unter https://github.com/jamwt/libtask –

+0

@RichardChambers Es scheint zu https://swtch.com/libtask/ umgezogen zu sein, jetzt habe ich den Beitrag – cthom06

2

Versuchen Sie GBL library, es hat alles: Coroutinen (Fasern), Threads, Sync und Async-Handler - und es ist alles moderne C++.

1

Von dem, was ich bis jetzt gesehen habe, scheint cilk ziemlich ähnlich zu gehen, um Parallelismus zu gehen. Es sieht so aus, als hätte Intel es gekauft und bietet kommerzielle Unterstützung mit Intel Cilk Plus.

Verwandte Themen