Czy istnieje techniczny powód istnienia przestrzeni nazw std :: this_thread? Dlaczego członkowie tej przestrzeni nazw nie zostali zaimplementowani jako statyczni członkowie klasy std :: thread?Dlaczego std :: this_thread namespace?
Odpowiedz
Od the original proposal, tak aby uzyskać thread::id
jest orkisz get_id()
czy otrzymujesz thread::id
dla siebie, ani dla wątku dziecko:
Uwaga używanie nazw
this_thread
disambiguate gdy jesteś żądanie identyfikatora dla bieżącego wątku, a nie id wątku podrzędnego. Nazwa tej akcji pozostaje niezmienna w interesie , zmniejszając pojęciowy ślad interfejsu.
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
Zatem nazw this_thread
jest czytelny sposób odróżnić dwóch, utrzymując interfejs koncepcyjne do minimum (tę samą nazwę dla coraz id wątku).
Oto możliwe alternatywy design:
struct thread
{
static int get_id() {return 1;}
int get_id() const {return 2;}
};
Wadą tego rozwiązania jest to, że nie kompilacji:
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.
Kolejny projekt dałby członu statyczny inną nazwę. Ale teraz interfejs jest większy. Pierwotny wniosek traktowany również inną funkcję w ten sam sposób:
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
Zatem popełnił wiele sensu ponownego użycia nazwy więc klienci nie muszą się nauczyć tak wiele imion. Po prostu muszą nauczyć się korzystać z przestrzeni nazw this_thread
, jeśli chcą zapytać o bieżący wątek. Niestety komitet usunął anulowanie nici podczas standaryzacji.
Dzięki, ale w jaki sposób my_child_thread.get_id() może być niejednoznaczne? Myślę, że tutaj szukam prawdziwego przykładu. Wiem, że jest dużo do zrobienia. –
@ user2100815 Cóż, nie tak dwuznaczne jak "nie działa". Jeśli 'get_id' jest funkcją' static' member, która pobiera identyfikator bieżącego wątku, 'my_child_thread.get_id()' wywołuje tę funkcję statycznego członka. Zobacz http://codepad.org/JRTvzDLk dla uproszczonego przykładu. (Nawiasem mówiąc, nie wymyśliłem tego osobiście, ktoś napisał to w komentarzu godzinę temu!) – delnan
@ user2100815 daj nam przykład, jak inaczej byś to zrobił. –
- 1. alternatywa dla std :: this_thread :: sleep_for()
- 2. namespace std przeciążenia mniej niż
- 3. błąd: "std :: this_thread" nie został zadeklarowany
- 4. Czy można używać funkcji std :: this_thread * z boost :: threads?
- 5. C++ 11 'native_handle' nie jest członkiem 'std :: this_thread'
- 6. std :: condition_variable dlaczego potrzebuje std :: mutex
- 7. Kompilator LLVM 2.0: Ostrzeżenie za pomocą "using namespace std;"
- 8. Co wymaga ode mnie deklaracji "using namespace std;"?
- 9. Dlaczego std :: weak_ptr :: expired zoptymalizowano?
- 10. JavaScript Namespace
- 11. boost :: this_thread :: sleep() vs. nanosleep()?
- 12. Czy isnan w std :: namespace? Bardziej ogólnie, kiedy jest std :: konieczny, opcjonalny lub którego należy unikać?
- 13. Dlaczego std :: swap bitów w instancji std :: bitset nie działa?
- 14. Dlaczego musimy wiązać std :: cin i std :: cout?
- 15. Namespace PHP Global
- 16. PHP namespace simplexml problems
- 17. forward declaration of namespace
- 18. Dlaczego "use namespace :: autoclean" jest preferowane zamiast "no Moose"?
- 19. Dlaczego std :: lock_guard/std :: unique_lock nie używa typu wymazania?
- 20. std :: copy i std :: vector problemem
- 21. Dlaczego "std :: async" nie działa zgodnie z oczekiwaniami?
- 22. Dlaczego ADL ma pierwszeństwo przed funkcją w "std namespace", ale jest równy funkcji w przestrzeni nazw zdefiniowanej przez użytkownika?
- 23. Nieznany typ nazwa „namespace” XCode doładowania
- 24. Dlaczego można przypisać nullptr do std :: string?
- 25. Dlaczego nie ma std :: stou?
- 26. Dlaczego nie ma std :: protect?
- 27. Dlaczego nie ma std :: inplace_merge_unique?
- 28. Dlaczego std :: iterator jest przestarzały?
- 29. Dlaczego wszyscy używają niezatwierdzonych deklaracji przestrzeni nazw (np. Std :: not :: std: :)?
- 30. Firebase Remote Config with Namespace
to nazwa opisowa. –
@Alf Żartujesz? Przestrzeń nazw jest sprawą globalną - z pewnością nie odnosi się do "tego wątku". Poprosiłem też o względy techniczne. –
Nie, nie żartuję. ale musisz to zobaczyć z punktu widzenia jednego kodu odczytującego, który go używa. gdy czyta się 'this_thread :: sleep_for (duration)' oznacza, że ten wątek przejdzie w stan "duration". nie jakiś inny wątek. oczywiście, pojęcie "tego wątku" niekoniecznie jest intuicyjne. Rozmawiałem z ludźmi, którzy uważali to za całkowicie obce (przynajmniej na początku). :-) –