2012-08-02 3 views
12

Ich versuche gerade meine Hände auf g++ 4.6 und C++11 Funktionen. Jedes Mal, wenn ich einen einfachen Threading-Code mit -std=c++0x Flag kompilieren, stürzt es entweder mit Segmentierung Fehler oder es wirft nur einige seltsame Ausnahme.In g ++ ist C++ 11 Thread-Modell mit Pthreads im Hintergrund?

Ich lese einige Fragen zu C++11 Themen und ich erkannte, dass ich auch -pthread Flag verwenden müssen, um den Code richtig zu kompilieren. Mit -pthread funktionierte gut und ich konnte den Thread-Code ausführen.

Meine Frage ist, ob das C++11 Multithreading-Modell Pthreads im Hintergrund verwendet? Oder ist es von Grund auf neu geschrieben?

Ich weiß nicht, ob einige der Mitglieder sind gcc Mitwirkende, aber ich bin nur neugierig.

+0

@Kay es sieht aus wie die Frage ist über g ++ 4.6. – juanchopanza

+2

Die "einige seltsame Ausnahme" ist wahrscheinlich "std :: system_error", die vom Standard benötigt wird, wenn keine Threads erstellt werden können (z. B. weil Sie nicht mit "-pthread" mit libpthread.so verbunden haben). Ich arbeite an der Verbesserung der Nachricht, die Ausnahme gibt, siehe http://gcc.gnu.org/PR52681 –

+1

@ JonathanWakely .... Ja, das ist die Ausnahme, die ich auf meiner Linux-Maschine ... mit AMD beschäftigen Turion X2 .... Während es ohne "-thread" -Flag auf meinen Mitbewohners Intel-Maschine glatt ging ... – Recker

Antwort

21

Wenn Sie g++ -v ausführen, erhalten Sie eine Reihe von Informationen darüber, wie es konfiguriert wurde. Eines dieser Dinge wird in der Regel eine Linie sein, die

Thread model: posix 

wie

sieht, was bedeutet, dass es so konfiguriert wurde pThreads für die Threading-Bibliothek (std :: thread in libstdC++) zu verwenden, und das heißt, Sie müssen auch jede verwenden Flags, die für Pthreads auf Ihrem System benötigt werden ( -pthread unter Linux).

Das hat nichts spezifisch mit dem Standard zu tun, es ist nur ein Detail, wie der Standard, der von g implementiert ++

+4

NB Eines dieser Dinge wird _alles_ immer diese Zeile sein. Wenn die Thread-Unterstützung nicht vorhanden ist, wird es "Thread-Modell: single" sagen. –

+0

Beachten Sie, dass das von GCC berichtete Thread-Modell auch andere Teile von GCC widerspiegelt, wie libgcc und den Compiler selbst. Viele Dinge können auf dieser Thread-Implementierung basieren, nicht alle sind gleichermaßen offensichtlich. GCC ist in dieser Hinsicht ziemlich "monolithisch" ... – rubenvb

9

C++ ist nicht festgelegt, wie Threads implementiert ist. In der Praxis werden C++ - Threads im Allgemeinen als dünne Wrapper über bereits vorhandene System-Thread-Bibliotheken (wie Pthreads oder Windows-Threads) implementiert. Es gibt sogar eine Möglichkeit, mit std :: thread :: native_handle() auf das zugrunde liegende Thread-Objekt zuzugreifen.

+2

G ++ ist kein Unix-Compiler, es funktioniert auch unter Windows, wo es für die Verwendung von pthread-win32 oder nativen Windows-Threads konfiguriert werden kann. Bisher hat noch niemand die Arbeit für GCC getan, damit seine C++ 11-Thread-Bibliothek mit Windows-Threads arbeiten kann. Ich habe einige Ideen zu http://gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html veröffentlicht –

2

Der Grund, dass es abstürzt, ist, dass, wenn Sie nicht -pthreads oder -lpthreads angeben, eine Anzahl von schwach definierten pThreads Stub-Funktionen von libc verbunden ist. Diese Stub-Funktionen reichen aus, um Ihr Programm ohne Fehler zu verknüpfen. Das Erstellen eines Pthread erfordert jedoch die vollständige Bibliothek libpthread.a, und wenn der dynamische Linker (dl) versucht, diese fehlenden Funktionen aufzulösen, erhalten Sie eine Segmentierungsverletzung.