2009-08-19 5 views
8

eine Frage zu Fäden in C/C++ ...Threads in C, C++, C++ 0x, Pthread und steigern

C++ 0x-Syntax

#include <thread> 

void dummy() {} 

int main(int, char*[]) { 
    std::thread x(dummy); 
    std::thread y(dummy); 
    ... 
    return 0; 
} 

Wie viele Threads Dort? Zwei (x und y) oder drei (x, y und main)? Kann ich this_thread::yield() in Haupt anrufen? Und was bekomme ich von this_thread::get_id() in Haupt anrufen?

Pthread Syntax

#include <pthread.h> 

void dummy() {} 

int main(int, char*[]) { 
    pthread_t x, y; 
    pthread_create(&x, NULL, &dummy, NULL); 
    pthread_create(&y, NULL, &dummy, NULL); 
    ... 
    return 0; 
} 

Wie viele Threads gibt es? Zwei (x und y) oder drei (x, y und main)? Kann ich pthread_yield() in Haupt anrufen? Und was bekomme ich von pthread_self() in Haupt anrufen?

Boost-Syntax

#include <boost/thread> 

void dummy() {} 

int main(int, char*[]) { 
    boost::thread x(dummy); 
    boost::thread y(dummy); 
    ... 
    return 0; 
} 

Wie viele Threads gibt es? Zwei (x und y) oder drei (x, y und main)? Kann ich boost::this_thread::yield() in Haupt anrufen? Und was bekomme ich von boost::this_thread::get_id() in Haupt anrufen?

+2

Im zweiten Beispiel haben Sie geschrieben pthread_t x, t; später verwendest du x, y; Tippfehler, denke ich. –

Antwort

25

In jedem Fall haben Sie zwei zusätzliche Threads erstellt, so dass Sie drei (x, y und main) haben. Sie erhalten eine unterschiedliche ID für jeden der Threads, einschließlich eines Anrufs in main.

+1

Es ist selten, wenn eine große Frage so knapp beantwortet wird. –

+8

Nicht wirklich: Es ist dreimal die gleiche Frage wie die Boost-Version ist eine Implementierung des zukünftigen Standards (C++ 0x), die auf dem Posix One basiert ... – Klaim

0

Der Haupt-Thread ist immer da und Sie erstellen zusätzliche neue Threads. Wenn der Haupt-Thread abstirbt, stirbt das Programm oder das Verhalten ist nicht definiert. Es ist auch möglich, mit vielen Threads zu beginnen, da die Laufzeit starten kann (und oft - wie die linux_threads "pthreads" Implementierung) Threads auf eigene Faust.

Calling Yield ist immer möglich, da es nur dem os sagt, dass es den Rest der Zeitscheibe einem anderen Thread geben kann, wenn es einen mit derselben oder höherer Priorität gibt. Wenn Sie keine Low-Level-Synchronisationsfunktionen wie Spinlocks schreiben, gibt es keinen wirklichen Grund, jemals in Ihrer Anwendung die Ausbeute zu nennen.

0

Alle obigen drei Implementierungen ergeben die gleichen Ergebnisse. Da der std :: -Thread über 'Pthread' implementiert ist, werden alle drei Threads erstellt. Main wird Ihr übergeordneter Thread und die anderen werden untergeordnete Threads und haben unterschiedliche IDs, wenn jeder Thread erstellt wird und der boost :: thread vom selben Autor wie von std :: thread erstellt wird, aber einige Verbesserungen hinzugefügt werden.