2010-07-27 20 views

Antwort

6

Sie müssten auf das zugrunde liegende Thread-Primitiv zugreifen und einen Namen systemabhängig zuweisen. Debugging- und Crash-Logs sind inhärent systemabhängig und boost :: thread befasst sich mehr mit der Nicht-System-Abhängigkeit, d. H. Mit der Portabilität.

Es scheint (http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html), dass es keine dokumentierte Möglichkeit gibt, auf zugrunde liegende Systemressourcen für einen Boost-Thread zuzugreifen. (Aber ich habe es mir nie so kann ich etwas vermissen.)

Edit: (Wie David im Kommentar schreibt) http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread.nativehandle

+5

+1, 'boost :: thread' eine' native_handle' Methode, die verwendet werden können, die native API Griff des abrufen Faden. Sie müssten in die Thread-Bibliothek einsteigen, um zu wissen, was der bestimmte Typ ist, den es zurückgibt, und die API-Dokumentation, wie man dieses Handle benutzt, um ihm einen Namen zu geben ... –

+13

Für Linux: http://stackoverflow.com/questions/778085/how-to-name-a-thread-in-linux – moala

+9

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

4

Ich verwende boost 1.50.0 auf Win32 + VS2010 und thread::native_handle enthält Nummer was ich nicht geschafft habe, irgendetwas im System zu paaren. Auf der anderen Seite gibt die Methode thread::get_id() direkt Windows-Thread-ID in Form einer hexadezimalen Zeichenfolge zurück. Beachten Sie, dass der zurückgegebene Wert jedoch plattformspezifisch ist. Der folgende Code funktioniert unter Boost 1.50.0 + Win32 + VS2010. Teile des Codes wiederverwendet von 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); 
} 

Aufruf wie folgt aus:

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

Sie vermissen die Struktur 'THREADNAME_INFO' und' MS_VC_EXCEPTION'. Gibt es keinen besseren Weg, um die Nummer von der boost :: thread :: id zu bekommen? eek. – David

+0

Tut mir leid, ich habe keine Ahnung, wie es passiert ist, sollte jetzt abgeschlossen sein. Wie für die Thread-Nummer - ich weiß es nicht. Boost-Dokumente sagen, dass es überhaupt keinen Weg gibt ... – Odin

+0

Sie können die Thread-ID erhalten, indem Sie GetThreadId (in ) das native Handle übergeben, das Sie von einem Boost-Thread erhalten können. Von dort können Sie Ihre RaiseException-Sachen machen. GetThreadId ist jedoch moderner, Sie werden nicht in der Lage sein, auf XP zu laufen, denke ich. Es gibt auch eine Möglichkeit, das private unsigned int aus boost :: thread: id zu holen, wenn du GetThreadId nicht benutzen kannst - aber das ist sehr böse. – David

Verwandte Themen