2009-04-27 21 views
2

Ich bin auf der Suche nach leichtgewichtigen Multi-Threading-Framework für C++. Ich habe POSIX-Threads gefunden.
Bitte teilen Sie Ihre praktische Erfahrung mit POSIX-Threads mit: Bevor ich damit beginne, möchte ich die Vor- und Nachteile von echten Leuten kennen, nicht von Wiki.
Wenn Sie es praktisch mit etwas vergleichen (vielleicht, besser), wäre es interessant, beides zu wissen.POSIX-Threads Erfahrung? (Oder empfehlen Sie besser)

UPD: Cross-Plattform-Funktionen sind wirklich wichtig für mich, so würde ich diese Richtung beschrieben zu schätzen wissen.

UPD2: ich bereits eine Erfahrung mit einem Rahmen für QNX/Win32, aber es ist nicht leicht und - oh, ich vergaß, zu erwähnen - es kommerzielle, nicht frei, aber ich brauche eine kostenlose.

Antwort

12

Ich fand Boost.Threads wirklich nett zu sein, vor allem nach dem 1.35 Neuschreiben. POSIX-Threads unter Windows sind nicht so trivial, und es ist eine C-API, also würde ich definitiv Boost dafür bevorzugen. Es hat alles, was Sie brauchen, ist tragbar und erfordert wenig Setup.

+0

Können Sie ein wenig klären, warum ist Boost besser? Ich bin nicht sehr gewinnorientiert. Ich würde lieber Debugging-Unterstützung/Einfachheit/und so weiter bevorzugen. – avp

+0

Wie Anteru schrieb: Pthreads ist eine C-API, während Boost eine C++ - Bibliothek ist. – mmmmmmmm

+2

Boost ist auch nicht Windows-orientiert, sondern plattformübergreifend. Im Gegensatz zu Pthreads nutzt es die Vorteile von C++ - Funktionen und ist nach C++ - Idiomen gestaltet. Einige der Dinge, die es Ihnen über PThreads gibt sind: Typ Sicherheit, mehr Flexibilität bei der Übergabe von Parametern einen neuen Thread und einfachere Bedienung. Boost verwendet RAII ausgiebig, um beispielsweise eine Sperre zu erstellen, erstellen Sie einfach ein lokales Objekt und wenn es den Gültigkeitsbereich verlässt, wird die Sperre aufgehoben. Einfacher als Pthreads, wo Sie explizit eine Funktion aufrufen müssen, um eine Sperre freizugeben. (und Sie sind geschraubt, wenn Sie vergessen, oder eine Ausnahme ausgelöst wird) – jalf

2

Die POSIX-Threading-API ist eine C-API, nicht C++.

Wofür möchten Sie es verwenden? Persönlich finde ich es eine sehr ungeschickte und übermäßig verbale API. Aber es ist am besten, wenn Sie eine plattformübergreifende Entwicklung unter Unix/Linux-ähnlichen Betriebssystemen durchführen möchten. Es wird nicht nativ von Windows unterstützt.

Persönlich würde ich nicht eine Threading oder andere Betriebssystem abhängige API direkt in Ihrem Code verwenden. Erstellen Sie eine weitere Abstraktionsschicht darüber. Zum Beispiel haben wir eine so genannte "OS-Schicht" erstellt. ein C++ Framework zum Arbeiten mit Threads, Semaphoren, Timern, Mutexen usw. Unser Code verwendet dies ausschließlich. Unter der Haube haben wir Implementierungen für POSIX, Win32, INTEGRITY und vxWorks. Dadurch kann unser Code auf einer Vielzahl von Plattformen eingesetzt werden.

Wenn Sie nicht Ihre eigene Ebene bauen möchten, können Sie viele andere wie Boost, Qt usw.

+1

Es gibt eine Windows-Implementierung - http://sourceware.org/pthreads-win32/ –

+0

Danke, ich habe meine Antwort geändert, um zu sagen, "nicht nativ unter Windows unterstützt". Sie könnten auch die Cygwin-Route unter Windows verwenden, wenn Sie dort Pthreads verwenden möchten. –

+0

Schreiben Sie nicht Ihr eigenes, es sei denn, Sie möchten wirklich im Bibliotheksgeschäft sein, oder es ist so einfach, dass es einfach ist. Threading auf verschiedenen Betriebssystemen (zB Windows vs. Linux) funktioniert sehr unterschiedlich, und wenn Sie das im Vorfeld nicht richtig machen, haben Sie Probleme. –

2

I POSIX verwendet vor einer Weile für ein Programm, das ich schrieb ihren Blick auf die Wiederverwendung. Es funktionierte gut unter Linux und Solaris und es ist nicht besonders kompliziert zu implementieren. Mein Bruder auf der anderen Seite ist ein Windows-Programmierer und bevorzugte Verstärkung für Posix. Ich schätze, das hängt von deinem Ziel ab. Ich fand Boost auf der aufgeblähten Seite und hatte schlechte Dinge darüber gehört. Mein Bruder denkt, es ist das Größte seit dem Schnittbrot. Ich nehme an, es ist eine Ford-Chevy-Sache. Jeder wird eine Meinung haben.

2

Wenn Sie nicht möchten, Boost 's Thread-API, dann möchten Sie vielleicht auf POCO s schauen.

0

Ich habe festgestellt, dass es der Win32-Thread-API sehr ähnlich ist. Der einzige (echte) Unterschied, den Sie beachten müssen, ist, dass Win32-Mutexe nicht blockieren, wenn sie im selben Thread verwendet werden. Abgesehen davon ist es eine ziemlich direkte API.

+1

Das Mutex-Ding auf Posix kann vermieden werden, indem man sie als rekursiv kennzeichnet (pthread_mutexattr_settype (& attr, PTHREAD_MUTEX_RECURSIVE)) – mmmmmmmm

1

Wie Sie QNX erwähnen, werfen Sie einen Blick auf ACE. Es ist ein riesiger Rahmen, der für many platforms (einschließlich QNX) verfügbar ist. Andere haben bereits erwähnt Boost.

Sie sind gut beraten, eine dieser Bibliotheken anstelle der nicht portablen und fehleranfälligen C-APIs auf niedriger Ebene zu verwenden.

3

Eine andere C-Thread-API ist GThreads von GLib.Es gibt eine 1-zu-1-Zuordnung zwischen einigen gthread und pthread Anrufen wie pthread_create, aber gthreads hat zwei große Features, die ich gefunden habe, sehr nützlich:

  • Thread-Pools und
  • asynchrone Warteschlangen für das Senden von Nachrichten zwischen Fäden.

Die Thread-Pools sind sehr leistungsfähig und ermöglichen Dinge wie dynamische Größenanpassung des Pools. Siehe http://library.gnome.org/devel/glib/2.20/glib-Threads.html

1

Boost Threads-Bibliothek ist wahrscheinlich Ihre beste Wette, wenn Sie in C++ arbeiten. Ich hatte sehr positive Erfahrungen mit Unix und Win32. Vermeiden Sie ACE - schlechtes Design, falscher Ansatz. Schauen Sie sich auch Intel TBB an, obwohl ich es in der Praxis nicht benutzt habe.

Verwandte Themen