2009-08-19 4 views
8

Una domanda circa le discussioni in C/C++ ...Discussioni in C, C++, C++ 0x, pthread e aumentare

C++ 0x sintassi

#include <thread> 

void dummy() {} 

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

Quante discussioni sono Là? Due (xey) o tre (x, y e main)? Posso chiamare this_thread::yield() in main? E cosa ricevo dal chiamare this_thread::get_id() in main?

sintassi pthread

#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; 
} 

Quante discussioni ci sono? Due (xey) o tre (x, y e main)? Posso chiamare pthread_yield() in main? E cosa ricevo dal chiamare pthread_self() in main?

sintassi spinta

#include <boost/thread> 

void dummy() {} 

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

Quante discussioni ci sono? Due (xey) o tre (x, y e main)? Posso chiamare boost::this_thread::yield() in main? E cosa ricevo dal chiamare boost::this_thread::get_id() in main?

+2

Nell'esempio seco hai scritto pthread_t x, t; più tardi usi x, y; Errore di battitura credo. –

risposta

25

In ogni caso sono stati creati due thread aggiuntivi in ​​modo da avere tre (x, y e main). Otterrai un ID diverso su ciascuna delle discussioni, inclusa una chiamata principale.

+1

È raro che una domanda enorme sia così concisamente risposta. –

+8

Non proprio: è tre volte la stessa domanda in cui la versione boost è un'implementazione del futuro standard (C++ 0x) basato su posix one ... – Klaim

0

Il thread principale è sempre lì e si creano nuovi thread aggiuntivi. Se il filo principale muore, il programma muore o il comportamento non è definito. È anche possibile iniziare con un sacco di thread all'avvio del runtime (e spesso, come il thread di linux_threads "pthreads" per l'implementazione) sui propri thread.

La resa di chiamata è sempre possibile in quanto indica solo al sistema operativo che può assegnare il resto del segmento di tempo a un altro thread se esiste uno con priorità uguale o superiore. Se non si scrivono funzioni di sincronizzazione di basso livello come spinlock, non vi è alcun motivo reale per chiamare il rendimento nella propria applicazione.

0

Tutte le suddette tre implementazioni danno gli stessi risultati. Siccome lo std :: thread è implementato in cima a 'pthread' quindi tutto creerà tre thread. Main sarà il thread principale e gli altri diventeranno thread secondari e avranno ID diversi quando ogni thread è stato creato e il boost :: thread è creato dallo stesso autore di std :: thread ma aggiungendo alcuni miglioramenti.