2010-07-27 17 views

Respuesta

6

Necesitará 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 una cadena de impulso. (Pero nunca he utilizado yo mismo, así que puede perder 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

+5

+1, 'impulso :: thread' tiene un método' native_handle' que se puede utilizar para recuperar el identificador API nativa de la hilo. Debería profundizar en la biblioteca de subprocesos para saber cuál es el tipo particular que devuelve y la documentación de API sobre cómo usar ese identificador para darle un nombre ... –

+13

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

+9

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

4

estoy usando impulso 1.50.0 en Win32 + VS2010 y thread::native_handle contiene el número de 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 de reutilizar 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); 
} 

llamada así:

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

Falta la estructura 'THREADNAME_INFO' y' MS_VC_EXCEPTION'. ¿No hay mejor forma de obtener el número del boost :: thread :: id? eek. – David

+0

Lo siento, no tengo idea de cómo sucedió, debería estar completo ahora. En cuanto al número de hilo, no sé. Los documentos de Boost dicen que no hay forma de ... – Odin

+0

puede obtener el id. Del hilo al pasar GetThreadId (en ) el identificador nativo, que puede obtener de un subproceso ... Desde allí puede hacer sus cosas de RaiseException. GetThreadId es más moderno, no creo que puedas ejecutar XP. También hay una manera de obtener el int privado sin firmar de boost :: thread: id si no puedes usar GetThreadId, pero eso es realmente malo. – David

Cuestiones relacionadas