Pregunta

Tengo un pthread_t, y me gustaría cambiar su afinidad de la CPU. El problema es que estoy usando glibc 2.3.2, que no tiene pthread_setaffinity_np () "rel =" noreferrer. Eso está bien, sin embargo, porque pthread_setaffinity_np () es en sí mismo un envoltorio de () , que puede ser llamado pasando un ID del hilo en lugar de un identificador de proceso para establecer la afinidad por un hilo arbitrario.

y ... La ID del tema que sched_setaffinity puede trabajar con una ID del tema OS, el tipo que se puede obtener de la gettid () llamada al sistema. Esto es diferente del tipo opaco pthread_t , y gettid () sólo devolverá el hilo-id del hilo actual . Necesito ser capaz de establecer la afinidad de CPU de un hilo arbitrario.

Por desgracia, no puedo acceder a las partes íntimas de la pthread, que me dejaban robar el ID del tema mediante la emisión del pthread_t a un struct pthread *. Tanto mejor, supongo, ya confiar en implementaciones particulares está pidiendo incluso más problemas.

También he estado leyendo sobre la función pthread_getunique_np , sin embargo, este devuelve un "identificador integral único." - que no creo es en cualquier manera o forma equivalente a un ID del tema OS

Por lo tanto, la pregunta: ¿Cómo puedo obtener un ID del hilo de una pthread_t arbitraria

¿Fue útil?

Solución

Desde pthreads no necesita ser implementado con hilos de Linux (o hilos del núcleo en absoluto, para el caso), y algunas implementaciones son del todo a nivel de usuario o mixto, la interfaz pthreads no proporciona funciones para acceder a estos detalles de implementación, como los que no habría portátil (incluso a través de pthreads implementaciones en Linux). bibliotecas de hilo que utilizan los podrían proporcionar esto como una extensión, pero no parecen ser cualquiera que hacer.

Además de acceder a las estructuras de datos internas de la librería de hilos (que comprensiblemente no quiere, aunque con sus suposiciones acerca de la afinidad del procesador y los ID de hilo de Linux, su código no será portable 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:

Da pthread_create() una función de entrada que llama gettid() (que por cierto, es probable que tenga que hacer uso de la macro syscall directamente ya que no siempre es exportado por libc), almacena el resultado en alguna parte, y después llama a la función de entrada original . Si tiene varios hilos con la misma función de entrada, se puede pasar un puntero incrementado en un array en el argumento arg a pthread_create, que luego se pasa a la función de entrada que creó para almacenar el ID del hilo en. Almacenar el valor de retorno pthread_t de pthread_create en el mismo orden, y entonces usted será capaz de buscar los ID de hilo de Linux de todas las discusiones que ha creado dado su valor pthread_t.

Si este truco vale la pena, depende de la importancia de establecer la afinidad de la CPU se encuentra en su caso, frente a no acceder a las estructuras internas de la biblioteca de hebras o en función de una biblioteca de hilo que proporciona pthread_setaffinity_np.

Otros consejos

En realidad vuelve pthread_self pthread_t y no un número entero ID del tema se puede trabajar con la siguiente función de ayuda para poder llegar que de una manera portable a través de 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;
}

Yo sugeriría una solución simple con un int matriz compartida donde se podría escribir el ID del tema de las roscas para acceder a ella más tarde.

Espero que ayude.

pthread_t pthread_self()

Este retorno pthread_t actual, que es ID del tema, se puede convertir al tipo "unsigned int",

glibc 2.24 el pthread_t devuelto es sólo el puntero a un struct pthread opaco. Puede buscar la definición de nptl/descr.h.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top