threads pthread_join pthread_create pthread caracteristicas c linux pthreads posix

pthread_create - pthread_join



Llamada de la API POSIX para listar todos los pthreads que se ejecutan en un proceso (3)

Tengo una aplicación de subprocesos múltiples en un entorno POSIX / Linux: no tengo control sobre el código que crea los pthreads. En algún momento el proceso, propietario de los pthreads, recibe una señal.

El controlador de esa señal debe abortar, cancelar o detener todos los pthreads y registrar cuántos pthreads se están ejecutando.

Mi problema es que no pude encontrar una lista de todos los pthreads que se ejecutan en proceso.


Dado que los subprocesos están en su proceso, deberían estar bajo su control. Puede registrarlos todos en una estructura de datos y realizar un seguimiento.

Sin embargo, hacer esto no estará libre de condiciones de carrera a menos que se administre de forma adecuada (o solo creas y te unes a hilos de un solo hilo).

Cualquier subproceso creado por las bibliotecas que utiliza es su negocio y no debe estar jugando con el directorio de ellos, o la biblioteca puede romperse.

Por supuesto, si planea salir del proceso, puede dejar los subprocesos ejecutándose de todos modos, ya que llamar a exit () los termina a todos.

Recuerde que, de todos modos, una aplicación robusta debe ser a prueba de choques, por lo que no debe depender del comportamiento de apagado para evitar la pérdida de datos, etc.


No parece haber ninguna forma portátil de enumerar los subprocesos en un proceso.

Linux tiene pthread_kill_other_threads_np , que parece un remanente de la implementación original de pthreads de puramente usuario que puede o no funcionar como se documenta hoy. No te dice cuántos hilos había.

Puede obtener mucha información sobre su proceso buscando en /proc/self (o, para otros procesos, /proc/123 ). Aunque muchos usuarios tienen un archivo o directorio con ese nombre, el diseño es completamente diferente, por lo que cualquier código que use /proc será específico de Linux. La documentación de /proc encuentra en Documentation/filesystems/proc.txt en la fuente del kernel. En particular, /proc/self/task tiene un subdirectorio para cada hilo. El nombre del subdirectorio es el ID de LWP; desafortunadamente, [1] [2] [3] no parece haber una manera de asociar los ID de LWP con los ID de pthread (pero puedes obtener tu propio ID de hilo con gettid(2) si trabajas para ello). Por supuesto, la lectura /proc/self/task no es atómica; el número de subprocesos está disponible atómicamente a través de /proc/self/status (pero, por supuesto, puede cambiar antes de que actúes sobre él).

Si no puede lograr lo que desea con el soporte limitado que obtiene de los pthreads de Linux, otra táctica es jugar trucos dinámicos de enlace para proporcionar su propia versión de pthread_create que se registra en una estructura de datos que puede inspeccionar posteriormente.


Podría ajustar ps -eLF (u otro comando que lea más de cerca solo el proceso que le interesa) y leer la columna NLWP para averiguar cuántos subprocesos se están ejecutando.