c++ - ¿Darle un nombre a un hilo de impulso?
debugging boost-thread (2)
¿Es posible dar un nombre a un boost::thread
para que las tablas de depuradores y los registros de fallos puedan ser más legibles? ¿Cómo?
Debería acceder a la primitiva de subproceso subyacente y asignar un nombre de una manera dependiente del sistema. Los registros de depuración y bloqueo dependen intrínsecamente del sistema y boost :: thread trata más sobre la dependencia del sistema, es decir, sobre la portabilidad.
Parece ( http://www.boost.org/doc/libs/1_43_0/doc/html/thread.html ) que no hay una forma documentada de acceder a los recursos subyacentes del sistema para un hilo de impulso. (Pero nunca lo he usado yo mismo, así que podría perderme algo).
Editar: (Como David escribe en el comentario) http://www.boost.org/doc/libs/1_43_0/doc/html/thread/thread_management.html#thread.thread_management.thread.nativehandle
Estoy usando boost 1.50.0 en Win32 + VS2010 y thread::native_handle
contiene un número que no logré emparejar con nada en el sistema. Por otro lado, el método thread::get_id()
devuelve directamente el ID del hilo de Windows en forma de una cadena hexadecimal. Sin embargo, tenga en cuenta que el valor devuelto es específico de la plataforma. El siguiente código funciona en Boost 1.50.0 + Win32 + VS2010. Partes de código reutilizadas de 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);
}
Llamar así:
boost::thread* thr = new boost::thread(boost::bind(...));
SetThreadName(thr->get_id(), "MyName");