pthread_join sin bloqueo

5 minutos de lectura

avatar de usuario
figura

Estoy codificando el apagado de un servidor multiproceso. Si todo va como debería, todos los subprocesos salen solos, pero existe una pequeña posibilidad de que un subproceso se atasque. En este caso, sería conveniente tener una unión sin bloqueo. por lo que podría hacer.

¿Hay alguna forma de hacer un pthread_join sin bloqueo? También sería bueno algún tipo de unión cronometrada.

algo como esto:

foreach thread do
  nb_pthread_join();
    if still running
      pthread_cancel();

Puedo pensar en más casos en los que una unión sin bloqueo sería útil.

Como parece que no existe tal función, ya he codificado una solución alternativa, pero no es tan simple como me gustaría.

  • unión de hilo sin bloqueo? Pensé que unirme era solo para bloquear :s

    – Mladen Janković

    16 de septiembre de 2008 a las 15:22

avatar de usuario
yves baumes

Si está ejecutando su aplicación en Linux, puede interesarle saber que:

int pthread_tryjoin_np(pthread_t thread, void **retval);

int pthread_timedjoin_np(pthread_t thread, void **retval,
                                const struct timespec *abstime);

Tenga cuidado, como sugiere el sufijo, “np” significa “no portátil”. No son extensiones estándar POSIX, gnu, aunque útiles.

enlace a la página man

El mecanismo ‘pthread_join’ es una conveniencia para usar si sucede que hace exactamente lo que desea. No hace nada que no puedas hacer tú mismo, y cuando no es exactamente lo que quieres, codifica exactamente lo que quieres.

No hay una razón real por la que deba importarte si un hilo ha terminado o no. Lo que le importa es si el trabajo que estaba haciendo el subproceso se completó. Para decir eso, haga que el hilo haga algo para indicar que está funcionando. La forma de hacerlo depende de lo que sea ideal para su problema específico, que depende en gran medida de lo que estén haciendo los subprocesos.

Comience por cambiar su forma de pensar. No es un hilo el que se atasca, es lo que estaba haciendo el hilo lo que se atasca.

  • ¿Agregar código de muestra por favor? Tengo aproximadamente el mismo problema, un proceso llama a dos subprocesos y solo debe salir una vez que los subprocesos salen; ninguna de las respuestas aquí explica cómo hacer algo similar a la función wait () de la bifurcación. (Agregué esta pregunta a favoritos, me notificará una vez que responda automáticamente)

    usuario649198

    10 de enero de 2012 a las 23:37


  • Tenga un valor booleano, protegido por una exclusión mutua, que almacene el estado de lo que desea saber. Si lo desea, utilice una variable de condición para indicarle el cambio del valor booleano.

    –David Schwartz

    10 de enero de 2012 a las 23:41

  • Gracias. El código de muestra sería útil, pero también podría intentar buscar en otro lugar.

    usuario649198

    10 de enero de 2012 a las 23:45

  • ¿Tu pregunta es simplemente “cómo espero algo”?

    –David Schwartz

    10 de enero de 2012 a las 23:51

  • @gry En lugar de intentar unirse al hilo, espere hasta que termine el trabajo. Esto reduce su pregunta a una mucho más simple: “¿cómo espero algo?”. La respuesta es usar variables de condición.

    –David Schwartz

    11 de enero de 2012 a las 1:08


Si está desarrollando para QNX, puede usar la función pthread_timedjoin().

De lo contrario, puede crear un subproceso separado que ejecutará pthread_join() y alertará al subproceso principal, señalando un semáforo, por ejemplo, que el subproceso secundario se completa. Este subproceso separado puede devolver lo que se obtiene de pthread_join() para permitir que el subproceso principal determine no solo cuándo se completa el elemento secundario, sino también qué valor devuelve.

La respuesta realmente depende de por qué quieres hacer esto. Si solo desea limpiar hilos muertos, por ejemplo, probablemente sea más fácil tener un hilo de “limpiador de hilos muertos” que se repita y se una.

  • Esta respuesta es incorrecta. Habiendo llamado exitosamente pthread_cancel en cada subproceso no garantiza que todos los subprocesos hayan salido. Es posible que no hayan llegado a ningún punto de cancelación, o incluso si lo han hecho, el hilo principal podría programarse primero y regresar de mainmatando el proceso, antes de que los otros subprocesos puedan terminar de limpiar…

    – R.. GitHub DEJA DE AYUDAR A ICE

    7 de julio de 2011 a las 3:32

  • Creo que esta respuesta necesita un pthread_join() después de pthread_cancel(): “Después de que un hilo cancelado haya terminado, una unión con ese hilo usando pthread_join(3) obtiene PTHREAD_CANCELED como el estado de salida del hilo. (Unirse a un hilo es la única manera para saber que la cancelación se ha completado.)”

    – Zoltán K.

    31 de marzo de 2019 a las 17:59

No estoy seguro de qué quiere decir exactamente, pero supongo que lo que realmente necesita es un mecanismo de espera y notificación.

En resumen, así es como funciona: espera a que se cumpla una condición con un tiempo de espera. Su espera habrá terminado si:

  • Ocurre el tiempo de espera, o
  • Si se cumple la condición.

Puede tener esto en un bucle y agregar algo más de inteligencia a su lógica. El mejor recurso que he encontrado para esto relacionado con Pthreads es este tutorial: Programación de hilos POSIX (https://computing.llnl.gov/tutorials/pthreads/).

También estoy muy sorprendido de ver que no hay una API para la unión temporizada en Pthreads.

avatar de usuario
shodanex

no hay cronometrado pthread_joinpero si está esperando que otro hilo se bloquee en condiciones, puede usar timed pthread_cond_timed_wait en lugar de pthread_cond_wait

avatar de usuario
doug t

Puede insertar un byte en una tubería abierta como sin bloqueo para señalar al otro subproceso cuando haya terminado, luego usar una lectura sin bloqueo para verificar el estado de la tubería.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad