2009-10-08 10 views
13

¿Hay alguna forma de obtener cualquier tipo de identificador de subprocesos del subproceso que se está ejecutando actualmente sin recurrir al NSThread de Objective-C?Mac/iPhone: ¿Hay alguna forma de obtener un identificador de subprocesos sin utilizar Objective-C?

Estoy mejorando nuestro sistema de seguimiento de errores personalizado para manejar correctamente varios hilos. Para cada línea de salida de rastreo, me gustaría imprimir un id. De subproceso o un nombre de subproceso. Los subprocesos se instancian de varias maneras, p. se usan las funciones NSOperationQueue y pthread.

Actualmente tengo las siguientes dos alternativas, pero no estoy satisfecho con ninguna de ellas. ¿Hay más opciones?

opción pthread_t

pthread_t parece ser un typedef de una plataforma específica _opaque_pthread_h. Sería correcto utilizar campos de _opaque_pthread_h por ahora, incluso si es pirateado y no portátil. Tiene un campo de tipo __sig largo, pero parece tener el mismo valor para todos los hilos de mi proceso.

NSThread opción

[NSThread name] requiere NSAutoreleasePool a estar en su lugar, pero no quiero que eso sea un requisito ya que la mayoría de nuestro código es C++ puro, por lo que sería bueno que acaba de poner en marcha C++ función sin envoltura de piscina de autorelease.

Respuesta

22

Encontré una manera que es suficiente para obtener algún tipo de identificador único para la salida de rastreo.

pthread_mach_thread_np se puede utilizar para obtener un identificador de subproceso, un int sin firmar en iPhone.

mach_port_t tid = pthread_mach_thread_np(pthread_self()); 

Aparentemente esto es un mismo ID de hilo que se utiliza en la producción NSLog.

+0

¡Funciona muy bien, gracias! – JOM

+0

Oh, esto es TAN mucho mejor que el método que estaba usando antes: configurar y recuperar valores en el NSDictionary de la secuencia. ¡Gracias! (Compatible con OSX 10.4.) – Marc

+1

¿'pthread_mach_thread_np' no tiene las mismas limitaciones que' pthread_self'? A saber, 'thread_id' reutilizar con más frecuencia de lo esperado/deseado? – jww

1

Ver pthread_getname_np.

Lamentablemente, el nombre de NSThread no se ha reducido a eso. El nombre NSThread es solo un ivar, por lo que no habrá forma de obtenerlo, excepto a través del método. Siempre puede hacer una función C que haga el grupo de autorrelease y obtenga el nombre. Su código C++ no tiene que compilarse como ObjC++.

pthread_getname_np es probablemente un poco más útil que el nombre de NSThread en este momento de todos modos. gdb e Instruments no conocen el nombre de NSThread, solo el nombre de nivel pthread.

+0

Excelente. Voy a intentar esto mañana. –

+1

Desafortunadamente, iPhone no tiene pthread_getname_np, por lo que esto no funciona en el iPhone. –

0

Una desventaja de utilizar un nombre de puerto Mach para identificar un hilo es que el nombre devuelto es local para el proceso de llamada. Si varias tareas recuperan los hilos de una tarea en particular (usando task_threads), cada tarea recuperará un nombre de puerto diferente para un hilo en particular.

En OS X, puede recuperar un identificador único de 64 bits utilizando thread_info. Este identificador es global (es lo mismo para un hilo determinado, sin importar qué tarea lo consulte) y único (ningún otro hilo tendrá el mismo ID, ahora o en el futuro, hasta después del reinicio, por supuesto, como un 64 valor de bit, desbordamiento es improbable).

(Ver XNU source, XNU source.)

recuperar este identificador para un pthread utilizando el código a lo largo de estas líneas:.

uint64_t GetThreadID(pthread_t thread) { 
    mach_port_name_t port=pthread_mach_thread_np(thread); 

    thread_identifier_info_data_t info; 
    mach_msg_type_number_t info_count=THREAD_IDENTIFIER_INFO_COUNT; 
    kern_return_t kr=thread_info(thread, 
           THREAD_IDENTIFIER_INFO, 
           (thread_info_t)&info, 
           &info_count); 
    if(kr!=KERN_SUCCESS) { 
     /* you can get a description of the error by calling 
     * mach_error_string(kr) 
     */ 
     return 0; 
    } else { 
     return info.thread_id; 
    } 
} 

(Ver XNU source)

Dos notas:

  1. No hay documentación para THREAD_IDENTIFIER_INFO, o al menos ninguno que he podido encontrar. Entonces, supongo, estrictamente hablando, eso lo hace indocumentado. Pero está en los encabezados públicos, justo al lado de THREAD_BASIC_INFO, que está documentado, así que supongo que esto es simplemente un descuido. No es como la documentación de cualquiera de estas cosas es particularmente grande.)

  2. No sé cuál es la situación en iOS, pero THREAD_IDENTIFIER_INFO y pthread_mach_thread_np ambos parecen estar disponibles en las cabeceras, por lo que podría valer la pena un intento.

Cuestiones relacionadas