2010-12-28 10 views
14

Quiero ser capaz de identificar los hilos mediante una simple identificación al iniciar sesión para que sea fácil rastrear la ejecución de un único hilo. Con Windows utilizando la API GetCurrentThreadId() puedo lograr lo que quiero. En boost::thread hay un método get_id() pero esto no representa un valor integral como un entero. Este objeto tiene un miembro thread_data que contiene un id que parece ser lo que quiero, pero el miembro de datos es privado, por lo que no se puede acceder.Cómo recuperar el id. De subproceso de un boost :: thread?

¿Cuál es la forma de impulsar el acceso a la identificación del hilo con fines de identificación o identificación?

Respuesta

9

Boost incluye una sobrecarga operator<<(std::ostream&, const boost::thread::id&) que se puede utilizar para escribir una ID del tema a una corriente (en realidad, la sobrecarga es una plantilla y funciona con cualquier especialización de std::basic_ostream, no sólo std::ostream).

El resultado de imprimir la identificación es probable que sea específico de la plataforma, ya que diferentes plataformas pueden usar representaciones internas diferentes para identificadores de subprocesos.

+0

así como un parámetro para una función, ¿pasaría el boost :: thread :: id para ser utilizado con un operador de flujo de salida? Suena parecido, excepto ¿qué ocurre si desea que el valor sea utilizable sin flujos ni operadores de flujo? – AJG85

+0

usando boost :: this_thread :: get_id() dentro de la función de trabajo de hilos realmente resuelta con el estilo de sprintf_s formateando ningún parámetro necesario. – AJG85

8

Necesita usar la función de miembro boost::thread::native_handle(). Devuelve un tipo native_handle_type que es un alias definido de implementación para un identificador de subproceso nativo, que luego se puede usar con las funciones de la API de subproceso nativo.

+0

Si bien es útil saber todo lo que necesito es la identificación del hilo. La razón principal para usar boost :: thread es evitar llamadas específicas del sistema operativo en mi caso. – AJG85

+3

@ AJG85: ... y 'nativehandle()' le proporcionará * exactamente * un identificador único, ¿cuál es el problema? No tienes que usarlo para nada más; eso fue meramente una explicación de lo que representa el valor; de hecho, es * exactamente * lo que obtendría de 'GetCurrentThreadId()'. Es importante destacar que este identificador será el mismo que se muestra en la ventana * threads * del depurador, por lo que conocer su valor puede ayudar a la depuración de subprocesos múltiples. – Clifford

+0

Buen punto. El hecho de que se pueda usar para llamadas nativas no significa que sea lo único para lo que es. También creo que es equivalente al identificador que obtendría de GetCurrentThread() en comparación con el ID entero devuelto por GetCurrentThreadId(). – AJG85

39

demasiado tarde, pero para los usuarios que buscan una respuesta, impulso permite consultar el ID del tema como usted ha dicho, sólo tiene que llamar al siguiente método:

boost::this_thread::get_id() 

Este método devuelve un tipo de ID interno del impulso, que no es numérico como quieras Pero puede convertir fácilmente este número a, por ejemplo, un largo sin signo teniendo en cuenta que el ID tiene una representación hexadecimal. Esta pequeña función hará de Trabajo:

#include <boost/lexical_cast.hpp> 
#include <boost/thread.hpp> 

unsigned long getThreadId(){ 
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 
    unsigned long threadNumber = 0; 
    sscanf(threadId.c_str(), "%lx", &threadNumber); 
    return threadNumber; 
} 

void drawThreadId(){ 
    std::cout << getThreadId() << std::endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
} 

int main() { 
    for(int i=0; i<10; i++){ 
     boost::thread thread = boost::thread(drawThreadId); 
    } 
    return 0; 
} 

Esto devolverá algo como esto:

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

No se olvide de enlace con boost_thread y boost_system.

Espero que esto ayude!

+0

+1 ¡Gracias, esto es lo que estaba buscando! – Avio

+0

¿Cómo obtengo la identificación del objeto de hebra? ('boost :: thread mythread') –

Cuestiones relacionadas