Ist es möglich, boost::thread
einen Namen zu geben, damit die Debugger-Tabellen und die Absturzprotokolle besser lesbar sind? Wie?Geben Sie einem Boost-Thread einen Namen?
Antwort
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
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");
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
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
Sie können die Thread-ID erhalten, indem Sie GetThreadId (in
+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 ... –
Für Linux: http://stackoverflow.com/questions/778085/how-to-name-a-thread-in-linux – moala
Für Windows: http://stackoverflow.com/questions/905876/how-to-set-name-to-a-win32-thread – moala