pthread_join - ¿Cómo obtengo un ID de hilo de un arbitrario pthread_t?
pthread_exit (5)
Como los pthread
s no necesitan ser implementados con hilos de Linux (o hilos de kernel, para el caso), y algunas implementaciones son completamente de nivel de usuario o mixtas, la interfaz de pthread
no proporciona funciones para acceder a estos detalles de implementación, como esos no serían portátiles (incluso a través de las implementaciones de pthread
en Linux). Las bibliotecas de subprocesos que usan esas pueden proporcionar esto como una extensión, pero no parece haber ninguna que lo haga.
Además de acceder a las estructuras de datos internas de la biblioteca de threading (que lógicamente no quiere, aunque con sus suposiciones sobre la afinidad del procesador y las ID de subprocesos de Linux, su código no será portátil de todos modos), es posible que pueda jugar un truco en el momento de la creación , si controlas el código que crea los hilos:
Proporcione a pthread_create()
una función de entrada que llame a gettid()
(que por cierto es probable que tenga que hacer usando directamente la macro syscall
porque no siempre es exportada por libc
), almacena el resultado en alguna parte y luego llama a la entrada original función. Si tiene múltiples hilos con la misma función de entrada, puede pasar un puntero incrementado a una matriz en el argumento arg
para pthread_create
, que luego se pasará a la función de entrada que creó para almacenar la ID del hilo. Almacene el valor de retorno pthread_t
de pthread_create
en el mismo orden, y luego podrá buscar los identificadores de subprocesos de Linux de todos los subprocesos que creó dado su valor pthread_t
.
Si este truco lo vale, depende de qué tan importante sea establecer la afinidad de la CPU en su caso, en lugar de no acceder a las estructuras internas de la biblioteca de subprocesos o en función de una biblioteca de subprocesos que proporcione pthread_setaffinity_np
.
Tengo un pthread_t y me gustaría cambiar su afinidad con la CPU. El problema es que estoy usando glibc 2.3.2, que no tiene pthread_setaffinity_np() . Sin embargo, eso está bien, porque pthread_setaffinity_np () es en sí mismo un contenedor de sched_setaffinity() , que se puede sched_setaffinity() al pasar un ID de hilo en lugar de un ID de proceso para establecer la afinidad por un hilo arbitrario.
PERO ... La id. De subproceso con la que sched_setaffinity puede funcionar es una id. De subproceso del sistema operativo, del tipo que se puede obtener de la llamada al sistema gettid() . Esto es diferente del tipo opaco pthread_t , y gettid () solo devolverá el id del subproceso del subproceso actual . Necesito poder establecer la afinidad de la CPU de un hilo arbitrario.
Lamentablemente, no puedo acceder a las partes privadas de pthread, lo que me permitiría robar el ID del hilo al struct pthread *
un pthread_t en struct pthread *
. Tanto mejor, supongo, ya que depender de implementaciones privadas es aún más problemático.
También he estado leyendo sobre la función pthread_getunique_np , sin embargo, esto devuelve un "identificador integral único", que no creo que sea de ninguna forma o forma equivalente a una id. De subproceso del sistema operativo.
Por lo tanto, la pregunta: ¿cómo puedo obtener un ID de hilo de un arbitrario pthread_t?
En glibc 2.24, el pthread_t
devuelto es solo el puntero a una struct pthread
opaca. Puede buscar la definición en nptl/descr.h
.
En realidad, pthread_self
devuelve pthread_t
y no un id. De subproceso entero con el que pueda trabajar, la siguiente función auxiliar lo obtendrá de forma portátil en diferentes sistemas POSIX.
uint64_t gettid() {
pthread_t ptid = pthread_self();
uint64_t threadId = 0;
memcpy(&threadId, &ptid, std::min(sizeof(threadId), sizeof(ptid)));
return threadId;
}
Sugeriría una solución simple con una matriz int compartida en la que podría escribir el id. De subproceso de los subprocesos para acceder más tarde.
Espero que ayude.
pthread_t pthread_self()
esta corriente de retorno pthread_t, que es id. de subproceso, puede convertirla para escribir "unsigned int",