2015-11-22 16 views
5

Quando abbiamo già una classe std::thread, allora perché abbiamo bisogno dello spazio dei nomi std::this_thread?std :: thread class vs std :: this_thread namespace in C++?

Quali sono le differenze di base tra di loro?

Quando è necessario utilizzare la classe std::thread e lo spazio dei nomi std::this_thread?

+4

Se solo ci fosse documentazione per questi da qualche parte ... – juanchopanza

+0

Quindi suppongo che abbiate già letto la [documentazione di riferimento] (http://en.cppreference.com/w/cpp/thread) dovreste vedere che è fondamentalmente diverso da la funzionalità di 'std :: thread'. Potresti essere più specifico, cosa per te non è chiaro per te. –

risposta

5

Le funzioni di gruppi dello spazio dei nomi this_thread che accedono al thread corrente, quindi quando è necessario eseguire qualcosa sul thread corrente, non è necessario accedere all'oggetto thread del thread.

La classe thread non fornisce l'accesso per la resa e la sospensione, queste funzioni hanno solo senso per il thread corrente e possono quindi essere trovate nello spazio dei nomi this_thread.

Se desideriamo informazioni su un thread diverso, abbiamo bisogno dell'istanza thread di quel thread, se abbiamo bisogno di accedere al thread corrente, possiamo sempre farlo attraverso le funzioni nello spazio dei nomi this_thread.

I pensieri per l'utilizzo di uno spazio dei nomi this_thread è stato spiegato anche nel progetto del prolungamento:

this_thread Namespace

Si noti l'uso del namespace this_thread per disambiguare quando si richiede il id per il thread corrente, vs id di un thread figlio. Il nome get_id per questa azione rimane lo stesso nell'interesse di ridurre l'impronta concettuale dell'interfaccia. Questo progetto vale anche per la funzione cancellation_requested:

std::thread my_child_thread(f); 
typedef std::thread::id ID: 

ID my_id std::this_thread::get_id(); // The current thread's id 
ID your_id my_child_thread.get_id(); // The child thread's id 

bool have_i_been_canceled = std::this_thread::cancellation_requested(); // Current thread's cancellation status 
bool have_you_been_canceled = my_child_thread.cancellation_requested(); // Child thread's cancellation status 

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2320.html

aggiungendo le funzioni dallo spazio dei nomi this_thread come membri statici della classe thread si sarebbe potuto fare, ma poi la funzione get_id avrebbe dovuto essere chiamato qualcos'altro, per renderlo chiaramente distinto dalla già esistente funzione get_id della classe thread. In altre parole, la mia ipotesi è che il team di C++ abbia deciso di aggiungere le funzioni a uno spazio dei nomi separato per rendere più chiaro che queste funzioni stavano leggendo o manipolando il thread corrente, qualcosa che non sarebbe stato altrettanto chiaro se fossero stati semplicemente aggiunti come statici membri della classe thread.

2

std::thread viene utilizzato per creare, monitorare e manipolare discussioni,
std::this_thread viene usata all'interno discussioni alreay creato.

Si potrebbe fornire this_thread come metodi statici all'interno di una classe pubblica all'interno di std::thread ma questa è una decisione di progettazione, oserei dire che questo tipo di progettazione è più simile a Java, dove incapsulare i dati come spazio dei nomi è più C++ - pilosophy tuned tipo di design.

Problemi correlati