Warum sollte ich in der Praxis den einen oder anderen bevorzugen? Was sind technische Unterschiede, außer dass std::thread
es sich um eine Klasse handelt?
std::thread
tut
std::thread
oder pthreads
nicht.
Warum sollte ich in der Praxis den einen oder anderen bevorzugen? Was sind technische Unterschiede, außer dass std::thread
es sich um eine Klasse handelt?
std::thread
tut
std::thread
oder pthreads
nicht.
Antworten:
Wenn Sie Code auf vielen Plattformen ausführen möchten, wählen Sie Posix Threads. Sie sind fast überall erhältlich und ziemlich ausgereift. Auf der anderen Seite std::thread
ist es vollkommen in Ordnung, wenn Sie nur Linux / gcc verwenden - es hat eine höhere Abstraktionsebene, eine wirklich gute Oberfläche und spielt sich gut mit anderen C ++ 11-Klassen.
Die C ++ 11- std::thread
Klasse funktioniert leider (noch) nicht auf jeder Plattform zuverlässig, auch wenn C ++ 11 verfügbar zu sein scheint. Zum Beispiel in nativem Android std::thread
oder Win64 funktioniert es einfach nicht oder weist schwerwiegende Leistungsengpässe auf (Stand 2012).
Ein guter Ersatz ist boost::thread
- es ist sehr ähnlich std::thread
(tatsächlich ist es vom selben Autor) und funktioniert zuverlässig, aber es führt natürlich eine weitere Abhängigkeit von einer Bibliothek eines Drittanbieters ein.
Bearbeiten: Ab 2017 std::thread
funktioniert meistens auf nativem Android. Einige Klassen wie std::timed_mutex
sind noch nicht implementiert.
std::thread
sein Raii-Stil gut, da er C ++ - Ausnahmen verarbeiten kann, während Pthreads nicht sofort einsatzbereit sind.
Die std::thread
Bibliothek wird über pthreads in einer Umgebung implementiert, die pthreads unterstützt (zum Beispiel: libstdc ++).
Ich denke, der große Unterschied zwischen den beiden ist die Abstraktion. std::thread
ist eine C ++ - Klassenbibliothek. Die std::thread
Bibliothek enthält viele abstrakte Funktionen, z. B. Sperren mit Gültigkeitsbereich, rekursive Mutexe, Implementierungen von Zukunfts- / Versprechen-Entwurfsmustern und vieles mehr.
+1
von mir für den Hinweis auf das Wichtigste, nämlich dass std :: thread eine höhere Abstraktionsebene liefert.
std::thread
bietet Portabilität auf verschiedenen Plattformen wie Windows, MacOS und Linux.
Wie von @hirshhornsalz in den Kommentaren unten und der zugehörigen Antwort https://stackoverflow.com/a/13135425/1158895 erwähnt , ist es std::thread
möglicherweise noch nicht auf allen Plattformen vollständig. Trotzdem (es wird in naher Zukunft sein) sollte es dem vorgezogen werden pthread
, weil es Ihre Anwendung zukunftssicherer machen sollte.
boost::thread
auf Win64 oder Bionic (Android) verwenden, da std::thread
es noch an großen Teilen mangelt, wo unter Linux std::thread
ziemlich ausgereift zu sein scheint.
Für mich ist der entscheidende technische Unterschied das Fehlen von Grundelementen für die Signalverarbeitung in std im Gegensatz zu pthreads. Die Unfähigkeit, die Signalverarbeitung in einem Unix-Prozess nur mit std richtig zu diktieren, ist AFAIK ein schwächender Fehler bei der Verwendung von std :: thread, da es nicht möglich ist, das echte Multithread-Signalverarbeitungsmuster einzurichten, um alle Signale in einem dedizierten Prozess zu verarbeiten fädeln und blockieren Sie sie im Rest. Sie müssen davon ausgehen, dass std :: thread mit pthreads implementiert wird, und hoffen auf das Beste, wenn Sie pthread_sigmask verwenden. Der ordnungsgemäße Umgang mit Signalen ist in der Unix-Systemprogrammierung für Unternehmen nicht verhandelbar.
Stand 2016 ist std :: thread ein Spielzeug; so einfach ist das.
std::thread
bringt Typ Sicherheit , dass Pthread nicht verfügt .
Das OpenMP
ist ein standardisierter, SMP-basierter Multithreading-Standard, der bereits seit über einem Jahrzehnt unter Linux und Windows arbeitet. OpenMP ist standardmäßig für alle Compiler verfügbar, einschließlich GCC und Microsoft Visual Studio.
Bei der Verwendung von OpenMP ist zu beachten, dass die Leistung aufgrund des mit dem Kontextwechsel verbundenen Overheads abnimmt, wenn mehr Threads als CPU-Kerne vorhanden sind. Das zweite, was zu beachten ist, ist, dass die Initialisierung eines tatsächlichen Threads auf Betriebssystemebene relativ teuer ist. Die Initialisierung dauert nur einen Bruchteil einer Sekunde, aber in einigen Anwendungen fallen die sehr kleinen Anteile mit erheblichem Aufwand an.
Für Anforderungen an die Softwarearchitektur im Zusammenhang mit der Parallelität Möglicherweise möchten Sie nach einer Implementierung von "Lightweight-Threads" oder "Green-Threads" suchen, anstatt OpenMP zu verwenden. Der Unterschied besteht darin, dass es sich bei den OpenMP-Threads um tatsächliche Threads auf Betriebssystemebene handelt. Die "grünen Threads" können jedoch nur "simulierte Threads" sein, die unter Verwendung einer kleinen Anzahl realer Threads ausgeführt werden.
std::async