2011-04-21 10 views
6

En un método nativo JNI, ¿hay alguna forma de conocer el ID del hilo actual sin invocar a Java? El almacenamiento local de subprocesos también funcionaría.NDK/JNI: identificando el hilo actual

EDITAR: pthread.h está presente en la carpeta de inclusión NDK ... ¿Alguien sabe si los hilos de Java corresponden a POSIX en la implementación de NDK?

Respuesta

5

¿Qué ID está interesado? Un volcado de hilo Dalvik incluye esto:

"main" prio=5 tid=1 TIMED_WAIT 
    | group="main" sCount=1 dsCount=0 obj=0x40017730 self=0x12798 
    | sysTid=3167 nice=0 sched=0/0 cgrp=default handle=-2146114456 
    | schedstat=(358850000 275073000 869) utm=23 stm=12 core=0

"tid" es la identificación de la VM. "handle" es el pthread_t. "sysTid" es el resultado de gettid() (el ID de proceso de Linux).

No se muestra la ID de hilo de libcore (obtenida de java.lang.Thread.getId()).

(Puede obtener lo anterior con "adb shell kill -3". La salida va a un archivo común, definido por la propiedad dalvik.vm.stack-trace-file - usualmente/data/anr/traces. txt, pero varía según el dispositivo.)

EDIT: Cada hilo de Dalvik VM es un subproceso de Linux. El gettid() syscall le dará una identificación única para cada hilo. Además, puede agregar información de identificación a TLS en java.lang.Thread o pthread_key.

+0

Estoy más que interesado en tener algunas acciones que no deberían realizarse en hilos que no sean el principal. If (! (El método JNI que se está ejecutando actualmente se llama desde un hilo Java trabajador) {bits del hilo principal}. –

+0

El VM no le da ningún tipo de tratamiento preferencial al hilo "principal". Puede obtener una aproximación comprobando si gettid() == getpid(), es decir, es el hilo principal de un proceso Linux, pero esto no está garantizado y podría romperse en el futuro. Un mejor plan es hacer que el subproceso de interfaz de usuario de la aplicación establezca un valor en el almacenamiento local de subprocesos (ya sea java.lang.Thread o pthread TLS) y verificarlo. – fadden

+1

por lo que java.lang.Threads * DO * corresponde a pthreads? Gracias. Mueva esa pepita de conocimiento en su respuesta, y lo acepto. La orientación del ADB no tiene relevancia para mí, estoy tratando de hacerlo de forma programática. –

Cuestiones relacionadas