2013-02-22 10 views
5

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?

+10

to nazwa opisowa. –

+1

@Alf Żartujesz? Przestrzeń nazw jest sprawą globalną - z pewnością nie odnosi się do "tego wątku". Poprosiłem też o względy techniczne. –

+11

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). :-) –

Odpowiedz

14

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.

+0

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. –

+0

@ 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

+1

@ user2100815 daj nam przykład, jak inaczej byś to zrobił. –

Powiązane problemy