pthread_t
no es una identificación de subproceso o un índice numérico. Es un tipo opaco. La creación de valores puede provocar un bloqueo.
En Linux NTPL, pthread_t se utiliza como un puntero:
int
__pthread_kill (threadid, signo)
pthread_t threadid;
int signo;
{
struct pthread *pd = (struct pthread *) threadid;
Debe ser bastante clara donde las cosas van mal ya :) Tenga en cuenta que este pointerness es también un detalle de implementación - la mayor aplicación Linuxthreads utilizado índices numéricos en una tabla, y allí usted podría inventar TID y no esperar que las cosas se cuelguen.
Necesita seguir el hilo de la vida y la muerte usted mismo. Un pthread_t
es válido hasta que llame al pthread_join
con éxito. Si desea probar si un válidopthread_t
está activo, llame al pthread_tryjoin_np
en él; si devuelve EBUSY
, el hilo está activo. Si la función tiene éxito, el pthread_t
ya no es válido; no debe volver a utilizarlo en este punto, por lo que debe anotar en alguna parte que ese hilo está muerto ahora, ¡y ya no es necesario que lo verifique más!
Podrías, por supuesto, implementar tu propio sistema de seguimiento: crear una tabla en algún lugar de vida, un sistema para distribuir TID y pasarlos a los subprocesos creados recientemente. Haga que cada hilo se marque como muerto antes de salir (tal vez usando pthread_cleanup_push
para manejar la cancelación de hilo y pthread_exit
), y separe el hilo para que no tenga que unirlo (usando pthread_detach
). Ahora tiene control explícito de su informe de muerte por hilos.
¿Qué valores "inválidos" estás usando? –
@DanFego Por ejemplo, 1001 –
Dado que pthread_t es un tipo opaco, usar un número entero (como 1001) teóricamente podría causar problemas y un bloqueo posterior. ¿Recibes advertencias compilando con -Wall? –