2011-09-26 6 views
37

Guardando oltre la roba nuova filettatura in C++ 11 per vedere come facilmente si associa a pthreads, ho notato la sezione curiosi nella zona thread costruttore:In C++ 11, qual è il punto di una discussione che "non rappresenta un thread di esecuzione"?

filo();
Effetti: Costruisce un oggetto thread che non rappresenta un thread di esecuzione.
Post-condizione: get_id() == id()
Produce: Niente.

In altre parole, il costruttore di default per un thread in realtà non sembra creare un filo. Ovviamente, crea un thread oggetto, ma come è esattamente utile se non c'è alcun codice di supporto per questo? C'è un altro modo in cui un "thread di esecuzione" può essere collegato a quell'oggetto, ad esempio thrd.start() o qualcosa di simile?

+0

C++ 11 è spaventare voi e me, sia a questo punto, per fortuna sono uno sviluppatore del kernel ora quindi gli standard non mi cambiano più :) –

+5

Penso che significano che il costruttore di thread non crea un thread vero, non chiama il sistema operativo, non alloca lo stack/altre risorse e in genere non crea un thread interrotto. Penso che questo sia a posto così le persone saprebbero che non stanno sprecando nulla creando il thread prima di avviarlo (a parte l'archiviazione di alcuni flags). – Dani

+5

@Jesus Ramos: il kernel ha paura delle modifiche standard? Se ricordo correttamente ogni nuovo processore rompe qualcosa nel kernel o aggiunge una funzionalità che richiede un sacco di riscrittura da implementare. – Dani

risposta

34

C'è un altro modo in cui un "thread di esecuzione" può essere collegato a quell'oggetto, come thrd.start() o qualcosa di simile?

// deferred start 
std::thread thread; 

// ... 

// let's start now 
thread = std::thread(functor, arg0, arg1); 

std::thread è un MoveConstructible e tipo MoveAssignable. Ciò significa che in codice come std::thread zombie(some_functor); std::thread steal(std::move(zombie));zombie verrà lasciato in uno stato speciale ma valido associato a nessun thread di esecuzione. Il costruttore predefinito viene liberato in un certo senso poiché tutto ciò che deve fare è mettere l'oggetto nello stato esatto. Consente inoltre le matrici di std::thread e operazioni come std::vector<std::thread>::resize.

+0

In realtà ... il thread avrà un ID di thread pari a 0. Non esiste un contesto di thread nativo interno. È solo un tipo segnaposto per array e contenitori stl. – Noishe

3

Solo supposizioni, ma significa semplicemente che il thread non è stato avviato. In altre parole, è solo un oggetto come un altro - non c'è necessariamente una vera e propria thread del sistema operativo. Per dirla in altro modo, se i thread sono stati implementati su pthreads, la creazione di un oggetto thread C++ 11 non chiama necessariamente pthread_create(), che deve avvenire solo all'avvio del thread.

+0

Quindi, ..., la mia domanda sarebbe quindi la seconda parte della mia domanda: "come si avvia?" – paxdiablo

+0

Forse non puoi. Dopo tutto, se hai utilizzato il costruttore di argomenti zero, non hai specificato nulla per il thread su * do *. Questo, suppongo, porta alla domanda sul perché sia ​​possibile creare un oggetto così inutile. – davmac

+0

Piuttosto: come sottolinea Luc Danton nella sua risposta di seguito, è possibile utilizzare l'operatore di assegnazione per avviare la discussione. – davmac

18

significa la stessa cosa come questo:

std::vector<int> emptyList; 

emptyList è vuota. Proprio come un predefinito std::thread. Proprio come un predefinito std::ofstream non apre un file. Ci sono ragioni perfettamente ragionevoli per avere classi che di default si costruiscono in uno stato vuoto.


Se si dispone di un filetto vuoto:

std::thread myThread; 

si può effettivamente iniziare il filo in questo modo:

myThread = std::thread(f, ...); 

Dove f è qualche cosa callable (puntatore a funzione, funtore, std::function, ecc.) E ... sono gli argomenti da inoltrare alla discussione.

8

Non solo indovinare:

"oggetto filo" si riferisce ad un std::thread.

"thread of execution" si riferisce allo OS's collection of hardware registers that represent a thread.

C++ 11 non sta facendo altro che incartare sull'API del sistema operativo per accedere ai thread del sistema operativo per rendere portatile il threading C++ su tutti i sistemi operativi.

thread();
Effetti: Costruisce un oggetto thread che non rappresenta un thread di esecuzione.
Post-condizione: get_id() == id()
Produce: Niente.

Questo significa un predefinito costruito std::thread non si riferisce a un thread di esecuzione che il sistema operativo ha prodotto.

Un std::thread può essere dato un nuovo valore, e quindi cominciano a fare riferimento a un thread di sistema operativo di esecuzione da un'istruzione di assegnazione mossa:

std::thread t; // Does not refer to an OS thread 
//... 
t = std::thread(my_func); // t refers to the OS thread executing my_func 
Problemi correlati