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?
c++
multithreading
c++11
pthreads
Shamdor
quelle
quelle
std::async
std::thread
tutstd::thread
oderpthreads
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 Androidstd::thread
oder Win64 funktioniert es einfach nicht oder weist schwerwiegende Leistungsengpässe auf (Stand 2012).Ein guter Ersatz ist
boost::thread
- es ist sehr ähnlichstd::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 wiestd::timed_mutex
sind noch nicht implementiert.quelle
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. Diestd::thread
Bibliothek enthält viele abstrakte Funktionen, z. B. Sperren mit Gültigkeitsbereich, rekursive Mutexe, Implementierungen von Zukunfts- / Versprechen-Entwurfsmustern und vieles mehr.quelle
+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 werdenpthread
, weil es Ihre Anwendung zukunftssicherer machen sollte.quelle
boost::thread
auf Win64 oder Bionic (Android) verwenden, dastd::thread
es noch an großen Teilen mangelt, wo unter Linuxstd::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.
quelle
std::thread
bringt Typ Sicherheit , dass Pthread nicht verfügt .Das OpenMP
http://www.openmp.org/
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.
quelle