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.