2010-07-27 21 views

Odpowiedz

6

Musisz uzyskać dostęp do podstawowej operacji podstawowej wątku i przypisać nazwę w sposób zależny od systemu. Debugowanie i dzienniki awarii są z natury zależne od systemu, a funkcja boost :: thread jest bardziej niezależna od systemu, tzn. Dotyczy przenośności.

Wygląda na to (http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html), że nie ma udokumentowanego sposobu uzyskania dostępu do zasobów systemowych dla wątku doładowania. (Ale ja nigdy go stosować się więc mogę coś przeoczyć.)

Edycja: (Jak Dawid pisze w komentarzu) http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread.nativehandle

+5

+1, 'boost :: thread' ma' metody native_handle' który może być używany do pobierania natywnego API uchwyt wątek. Będziesz musiał zagłębić się w bibliotece wątków, aby dowiedzieć się, jaki jest konkretny typ, który zwraca i dokumentacji API, w jaki sposób używać tego uchwytu, aby nadać mu nazwę ... –

+13

Dla systemu Linux: http://stackoverflow.com/questions/778085/how-to-name-a-thread-in-linux – moala

+9

Dla Windows: http://stackoverflow.com/questions/905876/how-to-set-name-to-a-win32-thread – moala

4

używam impuls 1.50.0 na Win32 + VS2010 i thread::native_handle zawiera numer którego nie udało mi się sparować z niczym w systemie. Z drugiej strony metoda thread::get_id() zwraca bezpośrednio identyfikator wątku systemu Windows w postaci ciągu szesnastkowego. Zwróć uwagę, że zwrócona wartość zależy od platformy. Poniższy kod działa w Boost 1.50.0 + Win32 + VS2010. Ponownego użycia części kodu z msdn

const DWORD MS_VC_EXCEPTION = 0x406D1388; 
#pragma pack(push, 8) 
typedef struct THREADNAME_INFO { 
    DWORD dwType; // Must be 0x1000. 
    LPCSTR szName; // Pointer to name (in user addr space). 
    DWORD dwThreadID; // Thread ID (-1=caller thread). 
    DWORD dwFlags; // Reserved for future use, must be zero. 
} THREADNAME_INFO; 
#pragma pack(pop) 

void _SetThreadName(DWORD threadId, const char* threadName) { 
    THREADNAME_INFO info; 
    info.dwType = 0x1000; 
    info.szName = threadName; 
    info.dwThreadID = threadId; 
    info.dwFlags = 0; 
    __try { 
     RaiseException(MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(ULONG_PTR), (ULONG_PTR*)&info); 
    } 
    __except(EXCEPTION_EXECUTE_HANDLER) { 
    } 
} 
void SetThreadName(boost::thread::id threadId, std::string threadName) { 
    // convert string to char* 
    const char* cchar = threadName.c_str(); 
    // convert HEX string to DWORD 
    unsigned int dwThreadId; 
    std::stringstream ss; 
    ss << std::hex << threadId; 
    ss >> dwThreadId; 
    // set thread name 
    _SetThreadName((DWORD)dwThreadId, cchar); 
} 

Wezwania tak:

boost::thread* thr = new boost::thread(boost::bind(...)); 
SetThreadName(thr->get_id(), "MyName"); 
+0

Brakuje struktury 'THREADNAME_INFO' i' MS_VC_EXCEPTION'. Czy nie ma lepszego sposobu na uzyskanie numeru z boost :: thread :: id? eek. – David

+0

Przepraszam za to, nie mam pojęcia, jak to się stało, powinien być już kompletny. Jeśli chodzi o numer wątku - nie wiem. Boost docs mówią, że nie ma żadnego sposobu na ... – Odin

+0

możesz uzyskać identyfikator wątku, przekazując GetThreadId (w ) natywny uchwyt, który można uzyskać z wątku doładowania. Stamtąd możesz zrobić rzeczy RaiseException. GetThreadId jest nowocześniejszy, ale nie będziesz w stanie uruchomić się na XP. Istnieje również sposób na uzyskanie niepodpisanej int z boost :: thread: id, jeśli nie możesz użyć GetThreadId - ale to naprawdę złe. – David

Powiązane problemy