tag pthread_t pthread_join pthread_create linux pthreads

linux - pthread_t - pthread_join



¿Cómo puedo determinar si un pthread separado está vivo? (3)

Esta pregunta asume un diseño con una condición de carrera inevitable.

Presumiblemente, planeas hacer algo como esto:

  1. Compruebe si el hilo está vivo
  2. Espera mensaje de hilo

El problema es que esta secuencia no es atómica y no se puede arreglar. Específicamente, ¿qué sucede si el hilo que está verificando muere entre el paso (1) y el paso (2)?

Las condiciones de la raza son malas; Las condiciones raras de la raza lo son doblemente. Hacer papel sobre algo con una fiabilidad del 90% con algo con una fiabilidad del 99.999% es una de las peores decisiones que puede tomar.

La respuesta correcta a tu pregunta es "no hagas eso". En su lugar, arregla tu aplicación para que los hilos no mueran al azar.

Si eso es imposible, y algunos subprocesos son propensos a fallar, y necesita recuperarse de eso ... Entonces su diseño es fundamentalmente defectuoso y no debería usar un subproceso. Ponga esa cosa poco confiable en un proceso diferente y use un conducto para comunicarse con él en su lugar. La muerte del proceso cierra los descriptores de archivos, y la lectura de una tubería cuyo otro extremo se ha cerrado tiene un comportamiento bien definido, fácil de detectar y sin carreras.

¿Cómo puedo determinar si un pthread separado todavía está vivo ?

Tengo un canal de comunicación con el hilo (una cola unidireccional que apunta hacia afuera desde el hilo) pero ¿qué sucede si el hilo muere sin un jadeo?

¿Debo resignarme a usar señales de proceso o puedo probar la vivacidad de los hilos de alguna manera?


Para un pthread que se pueda unir (es decir, NO separado) puede usar pthread_kill siguiente manera:

int ret = pthread_kill(YOUR_PTHREAD_ID, 0);

Si obtienes un valor de ESRCH , es posible que tu hilo esté muerto.

Sin embargo, esto no se aplica a un pthreads separado porque después de que haya terminado su ID de hilo se puede reutilizar para otro hilo.

De los comentarios:

La respuesta es incorrecta porque si el hilo está separado y no está vivo, el pthread_t no es válido. No puedes pasarlo a pthread_kill. Podría, por ejemplo, ser un puntero a una estructura que se liberó, causando que su programa se bloquee. POSIX dice: "Una implementación conforme puede reutilizar un ID de hilo una vez que haya finalizado su vida útil. Si una aplicación intenta usar un ID de hilo cuya vida útil ha finalizado, el comportamiento no está definido". - Gracias @DavidSchwartz