2008-10-20 16 views
41

Ich höre immer wieder von gleichzeitigen Programmierung überall. Kannst du etwas Licht auf das werfen, was es ist und wie C++ neue Standards das gleiche machen?Parallele Programmierung von C++?

+3

Wenn Concurrent Computing neu für Sie ist, stellen Sie sicher, einige grundlegende Artikel wie http://en.wikipedia.org/wiki/Concurrent_programming zu überprüfen. – lothar

Antwort

68

Parallelität bedeutet, dass Ihr Code mehrere Dinge gleichzeitig ausführt. Dies wird typischerweise mit expliziten "Threads" gemacht, aber es gibt andere Möglichkeiten. Wenn Sie beispielsweise in Ihrem Code OpenMP-Anweisungen verwenden, generiert ein Compiler, der OpenMP unterstützt, automatisch Threads für Sie.

Der Thread ist die Abkürzung für "Thread der Ausführung". In einem single-threaded C++ - Programm beginnt die Ausführung bei main() und wird dann sequenziell fortgesetzt. In einem Multithread-Programm startet der erste Thread bei main, aber zusätzliche Threads können von der Anwendung gestartet werden, die bei einer benutzerdefinierten Funktion starten. Diese laufen dann parallel oder parallel zum ursprünglichen Thread.

In C++ 0x-Threads gestartet wird die std::thread-Klasse:

void my_function() 
{ 
    // do stuff 
} 
std::thread my_thread(my_function); // run my_function in its own thread 

Der neue C++ 0x-Standard unterstützt auch:

  • atomare Werte und Operationen mit der std::atomic<> Klassenvorlage,
  • Mutexe für den Datenschutz (std::mutex, std::recursive_mutex, usw.)
  • Sperrklassen fo r eine einfache Verwaltung von Schloss Lebensdauer (std::lock_guard<>, std::unique_lock<>)
  • std::lock und std::try_lock Funktionen zu verwalten mehrere Schlösser zugleich den Erwerb ohne Deadlock zu riskieren
  • Bedingungsvariablen für eine Veranstaltung zu erleichtern warten (std::condition_variable, std::condition_variable_any)
  • Futures , Versprechen und Paketaufgaben, um die Übergabe von Daten zwischen Threads zu vereinfachen und darauf zu warten, dass ein Wert bereit ist. Dies betrifft die klassische Frage "Wie gebe ich einen Wert aus einem Thread zurück".
  • Thread-sichere Initialisierung lokaler statische Objekte
  • das thread_local Stichwort lokale Thread-Daten

Ich habe einen detaillierteren Überblick über die neuen C++ 0x Thread-Bibliothek in meinem Artikel über DevX zu erklären. com: Simpler Multithreading in C++0x

Ich schreibe über Multithreading und Nebenläufigkeit in C++ auf my blog. Ich schreibe auch ein Buch über das Thema: C++ Concurrency in Action.

+1

Kann irgendetwas hinzugefügt werden, jetzt da C++ 11 aus ist? Ich kann mir vorstellen, dass wir jetzt Bewegungssemantik verwenden können? – Damian

+0

Ja, Sie können die move-Semantik mit 'std :: thread' und' std :: async' verwenden. –

5

Concurrency mehrere Ausführungs-Threads für einen bestimmten Prozess wird mit. Ab heute unterstützt C++ das nicht direkt. Es existieren jedoch mehrere Bibliotheken, die eine bestimmte Funktion an einen neuen Ausführungsthread binden. Der Unix-Standard ist die Pthreads-Bibliothek.

+1

Der Posix-Standard (nicht Unix) –

17

Wenn Sie sagen, "wie C++ neue Standards erleichtern" gleichzeitige Programmierung, ich nehme an, Sie sprechen über die bald (?) Zu veröffentlichen C++ 09 Standard.

Der neue Standard, wie es derzeit im Entwurf steht unterstützt die folgenden Elemente, die bei gleichzeitiger Programmierung helfen:

  • Atomtypen und Adressen
  • eine Thread-Klasse
  • thread_local Lagerung (die gerade hinzugefügt wurde in den Normentwurf vor ein paar Monaten)
  • gegenseitiger Ausschluss (Mutex-Klassen)
  • Zustandsvariablen - das ist besonders schön für Windows, seit condit Ionenvariablen sind in Win32 schwer zu implementieren. Dies bedeutet, dass Microsoft möglicherweise zumindest in der MSVC++ - Laufzeit Unterstützung für Bedingungsvariablen bereitstellen sollte. Daher ist es einfach, die korrekte Semantik der Bedingungsvariablen in WIn32 zu erhalten.
+0

Hat jemand schon eine gute Zusammenfassung über diese Funktionen geschrieben? –

+0

Ich denke, dass sie stark auf boost :: thread basieren, also sollte es keinen großen Unterschied zwischen dieser Dokumentation und dem neuen Standard geben. – gbjbaanb

3

meine etwas anderen Art, die spezifisch für die zukünftige Ausrichtung von Programmierparadigmen:

Concurrency ist über Ihr Programm zu schreiben, so dass es können mehrere Dinge tun, wenn die Hardware unterstützt wird. Gegenwärtig haben die meisten Sprachen ziemlich schwere und komplizierte Mechanismen, die es dem Programmierer erlauben, dies zu spezifizieren (zB: Threads mit manueller Synchronisation, OpenMP-Preprozessor-Direktiven usw.).

Mit der Verbesserung der Hardware wird es sich horizontal (mehr Kerne) als vertikal (schneller Einzelkern) verbessern. Dies bedeutet, dass Apps "latente Parallelität" haben müssen, um mit "schnellerer" Hardware skalieren zu können. Die Sprachen versuchen derzeit, sich zu entwickeln, um dies bestmöglich zu unterstützen, um in der Position der besten Sprache für die zukünftige Entwicklung zu sein.

C++ 0x fügt mehr integrierte Unterstützung für die "alten" Methoden der Programmierung von Nebenläufigkeit hinzu. Verschiedene Compilerhersteller fügen "neue" Methoden hinzu, die das Threading-Modell abstrahieren und Laufzeitentscheidungen über die Anzahl der Threads usw. erlauben (basierend auf der Hardware der Maschine); für Microsoft insbesondere, siehe F #, Parallelität Laufzeit, parallele Erweiterungen, etc.

Hoffe, dass hilft.

5

C++ CSP2 - Easy Concurrency für C++

http://www.cs.kent.ac.uk/projects/ofa/c++csp/

CSP ist auf einem richtigen gleichzeitig Paradigma eine Basis im Gegensatz zu Fäden und Schlösser und alle anderen Arten von Dingen, die auf wie ein nachträglicher Einfall geheftet werden .

(siehe Occam-Pi für eine gleichzeitige Programmiersprache (auch auf Basis von CSP))

4

Artikel: diese Artikel prüfen über Gleichzeitigkeit

  1. Free lunch is over
  2. Selected articles by herbsutter
  3. Link to pdf
  4. wissen
+0

Fügen Sie eine Zusammenfassung der wichtigsten Punkte der Artikel hinzu, oder ist dies eine [Link-only-answer] (http://meta.stackexchange.com/questions/72000/should-there-bea- Richtlinie-über-nur-Link-nur-Antworten)? (Einer der Links ist bereits tot, btw.) – jogojapan

1

Dies ist Der beste Artikel, um gleichzeitige Programmierung zu verstehen: Concurrent Programming

Sie erhalten das volle Bild der gleichzeitigen Programmierung und C++ nach dem Lesen.

Als kurze Zusammenfassung können wir sagen, dass gleichzeitige Programmierung Multitasking ist. Wenn ein Programm blockiert wird, kann es andere Dinge tun. Normalerweise werden wir blockiert, während wir auf Netzwerkverbindungen warten und mit I/O arbeiten. Wir können die gleichzeitige Programmierung mit fork() und Thread-Bibliotheken erleichtern.

+0

Der Link, den Sie gepostet haben, gibt eine 404 zurück. – xyres