2010-12-28 14 views
14

Chcę móc identyfikować wątki za pomocą prostego identyfikatora podczas logowania, aby można było łatwo prześledzić wykonanie pojedynczego wątku. Dzięki oknom korzystającym z interfejsu API GetCurrentThreadId() można osiągnąć to, co chcę. W boost::thread istnieje metoda get_id(), ale nie reprezentuje ona wartości całkowitej, takiej jak liczba całkowita. Ten obiekt ma element thread_data, który zawiera id, który wydaje się być tym, czego chcę, ale element danych jest prywatny, więc nie można uzyskać do niego dostępu.Jak odzyskać identyfikator wątku z boost :: thread?

Jaki jest sposób zwiększenia dostępu do identyfikatora wątku w celu wyświetlania lub identyfikacji?

Odpowiedz

9

doładowania zawiera operator<<(std::ostream&, const boost::thread::id&) przeciążenie, które można wykorzystać, aby napisać id wątku do strumienia (faktycznie, przeciążenie jest szablon i będzie działać z każdą specjalizację std::basic_ostream, nie tylko std::ostream).

Wynik drukowania identyfikatora jest prawdopodobnie zależny od platformy, ponieważ różne platformy mogą używać różnych wewnętrznych reprezentacji dla identyfikatorów wątków.

+0

jako parametr do funkcji przekazałbym doładowanie :: wątek :: identyfikator do użycia z operatorem strumienia wyjściowego? To brzmi blisko, z wyjątkiem tego, jeśli chcesz, aby wartość była użyteczna bez strumieni lub operatorów strumieniowych? – AJG85

+0

przy użyciu instrukcji boost :: this_thread :: get_id() z funkcji wątków worker faktycznie opracowanej przy użyciu formatowania stylu sprintf_s bez parametru. – AJG85

8

Należy użyć funkcji członka boost::thread::native_handle(). Zwraca typ native_handle_type, który jest aliasem zdefiniowanym w implementacji dla natywnego identyfikatora wątku, który może być następnie używany z natywnymi funkcjami API wątku.

+0

Chociaż przydatne jest wiedzieć wszystko, czego potrzebuję, to identyfikator wątku. Głównym powodem używania boost :: thread jest unikanie wywołań specyficznych dla systemu operacyjnego w moim przypadku. – AJG85

+3

@ AJG85: ... i 'nativehandle()' zaproponują ci * dokładnie * taki unikalny identyfikator, więc na czym polega problem? Nie musisz go używać do niczego innego; to było tylko wyjaśnienie tego, co przedstawia wartość; w rzeczywistości * dokładnie * to, co otrzymasz z 'GetCurrentThreadId()'. Co ważne, ten identyfikator będzie taki sam, jak ten wyświetlany w oknie * wątków * debuggera, więc znajomość jego wartości może pomóc w debugowaniu wielowątkowym. – Clifford

+0

Dobra uwaga. Tylko dlatego, że może być używany do połączeń natywnych, nie oznacza, że ​​jest to jedyna rzecz, dla której jest. Sądzę też, że jest to odpowiednik uchwytów, które można uzyskać z GetCurrentThread(), w przeciwieństwie do liczby całkowitej zwróconej przez GetCurrentThreadId(). – AJG85

39

zbyt późno, ale dla użytkowników poszukujących odpowiedzi, Boost pozwala na zapoznanie się z id wątku, jak pan powiedział, po prostu dzwoniąc następującą metodę:

boost::this_thread::get_id() 

Metoda ta zwraca wewnętrzny typ ID z podbicia, że nie jest numeryczne, jak chcesz. Ale możesz łatwo przekonwertować tę liczbę na, na przykład, niepodpisaną długą, biorąc pod uwagę, że id ma postać heksadecymalną. Ta mała funkcja zrobi de praca:

#include <boost/lexical_cast.hpp> 
#include <boost/thread.hpp> 

unsigned long getThreadId(){ 
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 
    unsigned long threadNumber = 0; 
    sscanf(threadId.c_str(), "%lx", &threadNumber); 
    return threadNumber; 
} 

void drawThreadId(){ 
    std::cout << getThreadId() << std::endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
} 

int main() { 
    for(int i=0; i<10; i++){ 
     boost::thread thread = boost::thread(drawThreadId); 
    } 
    return 0; 
} 

ten powróci coś takiego:

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

nie zapomnij związek z boost_thread i boost_system.

Mam nadzieję, że to pomoże!

+0

+1 Dziękuję, tego właśnie szukałem! – Avio

+0

Jak pobrać ID z obiektu wątku? ('boost :: thread mitythread') –

Powiązane problemy