C ++ 11 std :: threads vs posix threads

157

Warum sollte ich in der Praxis den einen oder anderen bevorzugen? Was sind technische Unterschiede, außer dass std::threades sich um eine Klasse handelt?

Shamdor
quelle
5
In der Praxis sollten Siestd::async
Stephan Dollberg
Diese leiden unter den gleichen Problemen @bamboon wie std::threadtut
Gunther Piez
2
@hirschhornsalz aus Sicht des Compilers, ja. Aus technischer Sicht bietet es Ausnahmesicherheit, die std::threadoder pthreadsnicht.
Stephan Dollberg
15
Zur Wiedereröffnung gewählt. Die Forderung nach "technischen Unterschieden" macht dies objektiv beantwortbar. Die hohe Stimmenzahl zeigt an, dass andere diesen Beitrag als konstruktiv und hilfreich empfunden haben.
Adrian McCarthy
stackoverflow.com/questions/1273572/…
Ciro Santilli 法轮功 冠状 冠状. 六四 法轮功

Antworten:

120

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::threadist 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::threadKlasse funktioniert leider (noch) nicht auf jeder Plattform zuverlässig, auch wenn C ++ 11 verfügbar zu sein scheint. Zum Beispiel in nativem Android std::threadoder 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::threadfunktioniert meistens auf nativem Android. Einige Klassen wie std::timed_mutexsind noch nicht implementiert.

Gunther Piez
quelle
19
Haben Sie Beweise für diese "Leistungsengpass" -Ansprüche? Außerdem ist std::threadsein Raii-Stil gut, da er C ++ - Ausnahmen verarbeiten kann, während Pthreads nicht sofort einsatzbereit sind.
Jesse Good
9
Ist diese Antwort 2014 noch gültig?
Nonsensation
25
Was ist jetzt, Anfang 2017?
RMOBIS
9
Was ist jetzt, in der Mitte 2017?
Leichtigkeitsrennen im Orbit
14
Was ist jetzt, im Jahr 2018 Mitte?
59

Die std::threadBibliothek 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::threadist eine C ++ - Klassenbibliothek. Die std::threadBibliothek enthält viele abstrakte Funktionen, z. B. Sperren mit Gültigkeitsbereich, rekursive Mutexe, Implementierungen von Zukunfts- / Versprechen-Entwurfsmustern und vieles mehr.

Akira Takahashi
quelle
4
+1von mir für den Hinweis auf das Wichtigste, nämlich dass std :: thread eine höhere Abstraktionsebene liefert.
sbi
33

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::threadmö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.

Brady
quelle
2
Tatsächlich bietet std :: threads Portabilität auf allen Plattformen, die C ++ 11 unterstützen, während POSIX-Threads nur auf POSIX-Plattformen verfügbar sind (oder auf Plattformen, die eine minimale Kompatibilität anstreben).
Tobias Langner
1
Aus der praktischen Sicht ist dies einfach falsch. Ich habe mich vor einigen Monaten tatsächlich für diese Argumentation entschieden - es war ein großer Fehler. In der Praxis muss man boost::threadauf Win64 oder Bionic (Android) verwenden, da std::threades noch an großen Teilen mangelt, wo unter Linux std::threadziemlich ausgereift zu sein scheint.
Gunther Piez
1
@hirschhornsalz, der Punkt meiner Antwort ist, auf den Vorteil der Portabilität hinzuweisen, die die c ++ 11-Thread-Implementierung im Vergleich zu pthread bietet. Das OP hat nicht nach Boost gefragt, aber es ist auch tragbar.
Brady
3
@hirschhornsalz, was deinen negativen Ton und den Vorwurf betrifft, niemals Threads zu verwenden, sind sie einfach unkontraktiv und verdienen nicht viel Mühe von meiner Seite. Ich denke, es lohnt sich zumindest zu erwähnen, dass ein konstruktiverer Kommentar darin bestanden hätte, auf die Probleme hinzuweisen, die Sie beim Versuch hatten, std :: thread auf verschiedenen Plattformen zu verwenden.
Brady
3
Zusammenfassend kann c ++ 11 std :: thread nur mit neueren Versionen von GCC verwendet werden. Es ist in Visual Studio bei weitem nicht vollständig und kann daher unter Windows nicht verwendet werden. Und natürlich fehlt es in kommerziellen Compilern unter UNIX (Sun Studio unter Solaris, HP aCC unter HP-UX, IBM vacpp unter AIX). Wenn Ihre Zielplattform nur Linux ist, ist c ++ 11 std :: thread daher in Ordnung. Wenn Sie auch Windows oder anderes UNIX benötigen, ist boost :: thread der richtige Weg.
vond
7

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.

Wespe
quelle
7
Ich bin nicht einverstanden. Die starke Verwendung von Signalen ist ein Entwurfsmuster, das für die meisten Anwendungen vermieden werden kann.
Erik Alapää
Auch std::threadbringt Typ Sicherheit , dass Pthread nicht verfügt .
AlfC
-3

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.

Martin Vahi
quelle
6
Keine Respektlosigkeit, aber wie hängt das mit der Hauptfrage zusammen?
SRG