2017-10-28 2 views
2

Ich versuche nur ein Konzept von g ++ zu verstehen. Hier ist meine sehr einfach std :: thread Anwendung:g ++ - Warum muss ich die Option "-thread" übergeben, während ich std :: thread verwende?

#include <iostream> 
#include <thread> 

void func() { 
    std::cout << "Running..." << std::endl; 
} 

int main() 
{ 
    std::thread t(func); 
    t.join(); 
    return 0; 
} 

Ich kann es mit folgendem Befehl auf Mac OS/Xcode 9.0 Setup kompilieren:

g++ main.cpp -std=c++11

Aber ich bin nicht in der Lage, es zu kompilieren auf Linux mit dem gleichen Befehl, so weit ich weiß muss ich auch -pthread Option übergeben. Ansonsten gibt es mir folgende Fehlermeldung:

gcc Version 7.1.1 20.170.622 (Red Hat 7.1.1-3)

main.o: In function `std::thread::thread<void (&)()>(void (&)())': 
/usr/include/c++/5/thread:137: undefined reference to `pthread_create' 

Ich denke, es ist unlogisch und ich sollte nicht einmal wissen, dass es die Umsetzung ist Std :: Thread-Klasse über Pthread. Warum muss ich -pthread Option und Link gegen Pthread-Bibliothek übergeben? Soll mich C++ 11 nicht von plattformspezifischen Details abstrahieren? Oder habe ich noch andere alternative Bibliotheken wie pthread, die ich für meine std. :: thread usage verlinken kann? Oder sollte ich das als Fehler melden?

Danke.

+0

Mit einer modernen Version von GCC sollten Sie dies nicht tun müssen - was ist Ihre GCC-Version? –

+2

C++ 11 oder eine andere Version gibt nicht an, wie Sie mit den Complier/Tools interagieren. Sie müssen nur akzeptieren, dass Sie auf manchen Plattformen den Compiler mit bestimmten Flags aufrufen müssen, wenn Sie bestimmte Funktionen benötigen. – nos

+0

@NeilButterworth gcc-Version 7.1.1 20170622 (Red Hat 7.1.1-3) –

Antwort

0

pthread ist ein Industriestandard über die spezifischen Threads des Betriebssystems, der die spezifischen Aufrufe des Betriebssystems verwendet.

std::thread ist eine Abstraktion in C++, die mit pthread oder den nativen Threads des Betriebssystems implementiert werden könnte. Aber um es auf so vielen Betriebssystemen wie möglich schnell arbeiten zu lassen, könnte der std-library Implementierer es einfach in posix implementieren, da es gut sein sollte, auf allen kompatiblen Betriebssystemen zu laufen.

Es gibt Ausnahmen, einige Windows nur std-library verwendet Windows native Threads stattdessen.

Verwandte Themen