2010-06-26 15 views
9

Ich möchte Multithreading in C++ lernen. Ich lerne es auch auf Java. Wenn ich in Java ein Programm schreibe, das Multithreading verwendet, wird es überall funktionieren. Aber hängt Multithreading in C++ nicht von plattformspezifischen APIs ab? Wenn dem so ist, scheint dies die Portabilität zu behindern.Multithreading in C++ ... wo soll ich anfangen?

Wie kann ich Multithreading in C++ durchführen, ohne Portabilitätsprobleme zu verursachen? Ist die thread Bibliothek von boost eine gute Lösung?

Als Nebenbemerkung - wie ist es überhaupt möglich, Multithreading als Bibliothek zu implementieren? Ist das nicht etwas, was der Compiler machen muss?

+1

Als ein Wort der Vorsicht müssen Sie viel mehr über Thread-Sicherheit in C++ nachdenken. Man kann nicht einfach Schlüsselwörter für Klassenmethoden streuen, um sie threadsicher zu machen. Sie werden in der Regel Werkzeuge wie Mutexe oder andere Formen kritischer Abschnitte, atomare Operationen usw. verwenden. Sie werden jedoch in der Lage sein, sehr effizienten Multithread-Code zu schreiben, wenn Sie es richtig machen. Sie können sogar Ihre eigenen Speicherzuordner mit Speicherpools pro Thread schreiben, aber es ist viel niedriger und viel schwieriger zu schreiben als Java. – stinky472

+0

(+1) @ stinky472: Genau deshalb möchte ich Multithreading sowohl in C++ als auch in Java lernen. Ich finde, dass Java generell gut für High-Level-Intros zu vielen Themen ist, aber nur mit Java zu bleiben, kann der Programmierer ein bisschen zu viel werden und sie nicht einigen sehr wichtigen Konzepten aussetzen. Deshalb, während ich Multithreading in Java lerne, möchte ich es gleichzeitig in C++ lernen, um sicherzustellen, dass ich alles lerne, was ich sein sollte. – Cam

Antwort

13

Wenn Sie die noch C++0x keinen Compiler (verfügbar mit Visual Studio C++ 2010 zum Beispiel), Verwendung Boost Threads unterstützt. (Es sei denn, Sie verwenden ein Framework, das Threading bereits unterstützt, was nicht der Fall ist - Sie würden die Frage nicht anders stellen -). Diese Boost-Threads wurden tatsächlich zum Standard im brandneuen C++. Vor dieser Zeit war C++ selbst Thread nicht bewusst.

TBB Threading Building Blocks könnte auch interessant für Sie sein, wenn Sie andere Aspekte in der parallelen Programmierung lernen möchten.

In Bezug auf Qt: Wenn Sie nur Threading-Unterstützung wollen, ist es komplett übertrieben. Es hat furchtbar langsame Umlaufzeiten vom Kompilieren zum Ergebnis. Es ist wirklich gut durchdachte Gedanken. Aber kein offizieller Standard wie die C++ 0x Threads von Boost. Daher würde ich es nicht als erste Wahl betrachten.

+0

Danke. Alle Antworten waren sehr hilfreich, aber dieses war das informativste. – Cam

3

In C++ ist ja das Threading plattformspezifisch. Viele Threading-Bibliotheken kapseln jedoch die Nuancen von Threads auf verschiedenen Plattformen und bieten damit eine einheitliche API, mit der Sie Ihre App mit Threads schreiben können, sodass Sie sich keine Gedanken um plattformspezifische Details machen müssen.

Boost Threading-Bibliothek ist eine sehr gute Lösung.

Ich empfehle auch Auschecken ACE als auch.

1

Um einen anderen Vorschlag als Boost zu bieten, verwende ich Pthreads (oder Pthreads-Win32 unter Windows). Es handelt sich um eine Barebone-Bibliothek, die alles selbst erstellt, aber Sie mit allem versorgt, was Sie brauchen und sonst nichts. Es ist sehr leicht im Vergleich zu Boost und Sie können leicht C++ - Wrapper um es herum finden, um Ihnen Abstraktionen höherer Ebene zu geben.

+0

Die Threading-Bibliothek von Boost ist eine Vorlage "nur Header" -Bibliothek. Es verursacht keinen großen Aufwand. Ok, die Menge der benötigten Dateien ist vielleicht riesig, aber im Endergebnis werden Sie nur ein paar Bytes von der Template-Instanziierung haben. – jdehaan

+0

@jdehaan: Können Sie erweitern, was Sie mit "Vorlage" Header nur "Bibliothek" meinen? – Cam

+3

Ich muss zugeben, ich bin auch ziemlich überrascht von der "Kopfzeile". Dies: 'libboost_thread-vc100-mt-gd-1_43.lib' sieht nicht wie eine Kopfzeile aus. –

4

des rückwärts Beginnen wir:

Wie ist es möglich, Einfädeln in einer Bibliothek zu implementieren?

Es ist nicht, zumindest nicht in (reinem) C++. Dies erfordert Sprache Unterstützung (der Compiler ist nur eine Implementierung).

Im Moment 2 Dinge verwendet werden:

  • Assembler-Code für einige Teile (wie in der pthread Bibliothek)
  • spezifische Compiler Anweisungen für andere (abhängig von den Compiler und Plattform)

Beide sind spröde und erfordern eine enorme Arbeit für die Portabilität. Grundsätzlich bedeutet es viele #ifdef Teile im Code für den Compiler und Zielarchitektur zu testen, für die Unterstützung einiger Richtlinien usw. testen ...

Deshalb wurde es als notwendig erachtet, Threading-Unterstützung in C++ 0x hinzuzufügen .

Wie mache ich Multithreading?

Bevor Sie eine Bibliothek auswählen, sollten Sie eine Methode auswählen. Es gibt 2 Möglichkeiten der Programmierung Multithreading-Anwendungen (und Sie können sie kombinieren):

  • von teilen Kommunizieren: Das bedeutet, mit mutexes, atomare Operationen, etc ... Sie pthread auf Linux-Plattformen verwenden können, aber ich würde unter anderem Boost.Thread für seine Portabilität empfehlen.
  • Teilen durch Kommunikation: neuere und an verteilte Berechnungen angepasst, stammt dies aus den funktionalen Sprachen. Dies bedeutet, dass Nachrichten von einem Thread an einen anderen weitergegeben werden und keine Ressourcen freigegeben werden. Sie können FastFlow oder Intels Thread Building Blocks aka TBB verwenden.

Sie können die beiden möglicherweise verschmelzen, aber es wäre besser, nicht zu. Persönlich habe ich die Beschreibung von FastFlow total genial gefunden: es fördert lock-freie Programmierung. Der Hauptvorteil der zweiten Methode besteht darin, dass sie besser für die Programmierung von mehreren Prozessen geeignet ist und auf verteilte Umgebungen skaliert werden kann.

Zunächst würde ich empfehlen, sich auf beide zu konzentrieren und einige Anwendungen damit zu bauen. Wenn Sie sich wohl fühlen, können Sie den anderen ausprobieren, aber seien Sie bereit, neu anzufangen, sie sind so anders.

+0

Es liegt nicht am Compiler, Threads zu unterstützen, es reicht bis zum Betriebssystem. Der Weg, um es in reinem C++ zu tun, ist zum Beispiel pthreads Header, verwenden Sie seine Funktionen und Link zu seiner lib. Der Compiler weiß nichts über Pthreads selbst. – Gianni

+0

Nun, ich würde sagen, dass die Verwendung einer Assembly-basierten Bibliothek nicht reines C++ verwendet;) Ich werde die Compiler-Sache jedoch korrigieren, ich meinte Sprache. –

+0

@Matthieu, was ich meinte ist, und app fragt eigentlich nur das Betriebssystem für einen Thread, und es bis zu dem OS zu erstellen und den Thread zu starten. Der ASM oder eingebaute Compiler-Funktionen (was nur mehr ASM bedeutet) wird nur für Atomics verwendet. Mutexes, Semaphore, Threads selbst sind alle bis zum Betriebssystem. – Gianni

1

könnten Sie auch Openmp http://openmp.org betrachten. Viele Compiler unterstützen es, einschließlich MS, GCC/G ++ und Intel. Obwohl Sie keine explizite Kontrolle über Threads erhalten, ist ihre Abstraktion der Parallelität auf höherer Ebene manchmal effizienter (sowohl zur Codierungszeit als auch zur Laufzeit) und der Code ist viel einfacher zu verstehen. Es wird dir nicht viel helfen, wenn du mit GUI arbeitest, aber für skalierbare Berechnungen ist es einen Blick wert.

1

Die Boost-Threading-Bibliothek ist wahrscheinlich der beste Ausgangspunkt für C++. Bietet Ihnen Threading-Contructs sowie alle Mutexe und Kontrollobjekte, die Sie benötigen, um eine wirklich funktionierende Multithread-Anwendung zu schreiben.

0

Wenn Sie dies aus Interesse tun, um Ihre Kenntnisse über verschiedene Programmiermodelle und Sprachkenntnisse zu verbessern, dann wäre die Boost-Bibliothek ein guter Weg. Ich würde jedoch lange und intensiv darüber nachdenken, ob ich tatsächlich Produktionsanwendungen mit Multithreading C++ erstellen möchte.

C++ ist anspruchsvoll genug zu Zeiten Korrektheit zu erreichen, ohne die beträchtliche Komplexität des Shared-Memory-Multi-Threading-Zugabe. Selbst die erfahrensten Programmierer würden zustimmen, dass Multi-Threaded-Programme extrem schwierig zu verstehen und richtig zu machen sind. Selbst die einfachsten Programme können bei Multi-Threading schnell schwer zu testen und zu debuggen sein.

Imperative Sprachen wie C++ oder Java oder C# (mit ihren veränderbaren Variablen, Shared Memory und Locking/Signaling-Primitiven) sind sehr oft die am wenigsten zugängliche Möglichkeit, Multi-Thread-Anwendungen zu erstellen. Es gibt normalerweise vollkommen gute Einzel-Thread-Implementierungsoptionen, um die meisten Anwendungsprobleme auf dem Benutzer-Space (im Gegensatz zu Kernel oder eingebetteten) zu erreichen, einschließlich auf Multi-Core-Maschinen.

Wenn Sie wirklich zuverlässig „multi-threaded“ Anwendungen erstellen möchte ich Ihnen funktionale Sprachen wie Erlang, Haskell, F # oder Clojure überprüfen würde vorschlagen.

2
//This program explains how pthread works, here 5 thread are trying to update a global variable simultaneously but with locking synchronization in maintained 
#include<iostream> 
#include<pthread.h> 
using namespace std ; 

#define MAX_NO_THREAD 5 

    int global_sum = 0 ; 
    pthread_mutex_t lock ; //Declared global lock mutex object 

void *print_fun(void *arg) 
{ 
    cout<<"\nThread id : "<<(int)arg; 
    pthread_mutex_lock(&lock) ; //aquiring lock on piece of code 
    for (int j=0; j<100000000; j++) 
    { 
     global_sum++ ; 
    } 
    pthread_mutex_unlock(&lock) ; //reomving lock on peice of code 
    cout<<"\nGlobal Sum : "<<global_sum ; 
} 

int main() 
{ 
    int i = 0 ; 
    pthread_t threads_obj[MAX_NO_THREAD] ; //Initializing object array for thread 
    pthread_mutex_init(&lock, NULL) ; //Initalinzing lock object for thread 
    int st ; 
    for (i=0; i<5; i++) 
    { 
     pthread_create(&threads_obj[i], NULL, *print_fun, (void *)i) ;//Initializing threads calling function print_fun 
     pthread_join(threads_obj[i], 0) ; //Forcing main thread to main until these thread complete 
    } 
    pthread_mutex_destroy(&lock) ; //Destroying lock object 
} 



//compile this program using -lpthread option with g++ 
//g++ thread.cc -lpthread 
Verwandte Themen