2013-02-22 39 views
5

Esiste un motivo tecnico per lo spazio dei nomi std :: this_thread? Perché i membri di questo spazio dei nomi non sono stati implementati come membri statici della classe std :: thread?Perché lo spazio dei nomi std :: this_thread?

+10

è un nome auto-descrittivo –

+1

@ Alf Stai scherzando? Uno spazio dei nomi è una cosa globale - certamente non si riferisce a "questo thread". Inoltre, ho chiesto ragioni tecniche. –

+11

no, non sto scherzando. ma è necessario vederlo dal punto di vista di un codice di lettura che lo utilizza. quando si legge 'this_thread :: sleep_for (duration)' significa che questo thread sta andando a dormire per 'duration'. non qualche altro thread. ovviamente, il concetto di "questo thread" non è necessariamente intuitivo. ho avuto discussioni con persone che l'hanno trovato totalmente alieno (almeno in un primo momento). :-) –

risposta

14

Da the original proposal, il modo per ottenere un thread::id è farro get_id() se si stanno ottenendo il thread::id per te, o per un thread figlio:

Nota l'uso della this_thread spazio dei nomi per disambiguare quando si è richiedendo l'id per il thread corrente, vs l'id di un thread figlio. Il nome get_id per questa azione rimane lo stesso nell'interesse di riducendo l'ingombro concettuale dell'interfaccia.

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 

quindi il namespace this_thread è un modo leggibile per differenziare tra i due, pur mantenendo l'interfaccia concettuale al minimo (stesso nome per ottenere un filo id).

Ecco un possibile progetto alternativo:

struct thread 
{ 
    static int get_id() {return 1;} 
    int get_id() const {return 2;} 
}; 

Uno svantaggio di questo progetto è che esso non può essere compilato:

test.cpp:4:9: error: static and non-static member functions with the same parameter types cannot be overloaded 
    int get_id() const {return 2;} 
     ^
test.cpp:3:16: note: previous declaration is here 
    static int get_id() {return 1;} 
      ^
1 error generated. 

Un altro disegno avrebbe dato un nome diverso il membro statico. Ma ora l'interfaccia è più grande. La proposta originaria trattato anche un'altra funzione esattamente allo stesso modo:

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 

Così ha fatto un sacco di senso di riutilizzare i nomi così i clienti non devono imparare tanti nomi. Devono solo imparare a usare lo spazio dei nomi this_thread se vogliono interrogare il thread corrente. Sfortunatamente il comitato ha rimosso la cancellazione del thread durante la standardizzazione.

+0

Grazie, ma come potrebbe my_child_thread.get_id() essere ambiguo? Credo che sto cercando un esempio di vita reale qui. Quello che so è molto da chiedere. –

+0

@ user2100815 Beh, non tanto ambiguo quanto "non funziona". Se 'get_id' è la funzione membro' static' per ottenere l'ID del thread corrente, 'my_child_thread.get_id()' chiama quella funzione membro statico. Vedi http://codepad.org/JRTvzDLk per un esempio semplificato. (A proposito, non l'ho inventato io stesso, qualcuno l'ha scritto in un commento un'ora fa!) – delnan

+1

@ user2100815 darci un esempio di come faresti altrimenti. –

Problemi correlati