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?
risposta
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 nomeget_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.
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. –
@ 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
@ user2100815 darci un esempio di come faresti altrimenti. –
- 1. std :: this_thread :: yield() vs std :: this_thread :: sleep_for()?
- 2. std :: thread class vs std :: this_thread namespace in C++?
- 3. Best practice: usare lo spazio dei nomi o riaprire lo spazio dei nomi?
- 4. Deserializing xml, compreso lo spazio dei nomi
- 5. Specificare l'assembly per lo spazio dei nomi
- 6. Corrispondenza spazio dei nomi
- 7. Qual è lo spazio dei nomi 'Standard'?
- 8. Cos'è lo spazio dei nomi in aerospike
- 9. come utilizzare lo spazio dei nomi Yii
- 10. utilizza lo spazio dei nomi in @param
- 11. Impossibile trovare lo spazio dei nomi System.Web.UI.DataVisualization.Charting
- 12. Come alias lo spazio dei nomi globale in C++ 11
- 13. Perché non c'è spazio dei nomi Microsoft.Win64?
- 14. std :: :: this_thread sleep_for() e GCC
- 15. utilizzando lo spazio dei nomi nell'implementazione della funzione
- 16. "usa lo spazio dei nomi" all'interno di un altro spazio dei nomi equivalente ad un alias?
- 17. Il nome o lo spazio dei nomi 'Http' non esiste nello spazio dei nomi 'System.Net'
- 18. Il nome o lo spazio dei nomi 'Linq' non esiste nello spazio dei nomi 'System.Data'
- 19. DataContractSerializer - modifica lo spazio dei nomi e deserializza il file associato allo spazio dei nomi precedente
- 20. errore: nessun tipo denominato 'vector' nello spazio dei nomi 'std'
- 21. Spazio dei nomi ASP.NET
- 22. Perché lo stile e lo stile non usano lo spazio dei nomi di Android?
- 23. Spazio dei nomi XSD nello spazio dei nomi C#
- 24. Come utilizzare lo spazio dei nomi su più file
- 25. 'vector' nello spazio dei nomi 'std' non specifica un tipo
- 26. Perché alcune funzioni di <cmath> non si trovano nello spazio dei nomi std?
- 27. Dove si trova lo spazio dei nomi System.Windows.Forms.Integration?
- 28. Impossibile trovare lo spazio dei nomi: creazione utilizzando TFS
- 29. Ottieni dinamicamente lo spazio dei nomi della classe PHP
- 30. modificare lo spazio dei nomi di un elemento con XSLT
è un nome auto-descrittivo –
@ Alf Stai scherzando? Uno spazio dei nomi è una cosa globale - certamente non si riferisce a "questo thread". Inoltre, ho chiesto ragioni tecniche. –
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). :-) –