es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo eliminar un hilo terminado de un proceso en ejecución.

Lo siento si la pregunta es bastante básica, pero he buscado en la documentación de QNX, probando todas las funciones que pueden terminar un hilo que no funcionan.

Tengo este programa de prueba que crea 2 hilos y hace que uno de ellos (el que tiene el main()) se ejecute para siempre mientras que el otro se termina en pthread_exit()

Al iniciar, escribir pidin | grep devolverá dos hilos en un proceso como se esperaba. Pero después de que se ha terminado un hilo, volver a ejecutar pidin | grep mostrará dos hilos, uno de ellos con estado DEAD. Sé que el hilo DEAD no se puede acceder de nuevo a menos que se unan cuando no están separados. Sin embargo, quiero saber si hay una manera de salir de un hilo y eliminarlo completamente del proceso, para que al escribir pidin | grep en el proceso de nuevo, se muestre solo un hilo funcionando en lugar de dos.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay forma de eliminar completamente un hilo terminado de un proceso. Incluso después de que se termina un hilo, sus recursos (como su pila y su bloque de control de hilo) todavía son retenidos por el proceso hasta que el proceso mismo se termine. Lo mejor que se puede hacer es separar el hilo antes de terminarlo, para que sus recursos sean limpiados automáticamente por el sistema.

    Para separar un hilo se puede llamar a la función pthread_detach(pthread_t thread) antes de terminarlo. Esto permitirá que el hilo sea limpiado automáticamente cuando salga, sin requerir una llamada a pthread_join().

    Aquí se muestra cómo se puede modificar el código para separar el hilo antes de terminarlo:

    #include <pthread.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    void *thread(void *arg) {
      char *ret;
    
      if ((ret = (char*) malloc(20)) == NULL) {
        perror("malloc() error");
        exit(2);
      }
      int input;
      printf("type a num to exit\n");
      scanf("%d",&input);
      strcpy(ret, "This is a test");
    
      // separar el hilo antes de salir
      pthread_detach(pthread_self());
    
      pthread_exit(ret);
    }
    
    int main() {
      pthread_t thid;
      void *ret;
    
      if (pthread_create(&thid, NULL, thread, NULL) != 0) {
        perror("pthread_create() error");
        exit(1);
      }
    
      while(1){
    
      }
    
      // no es necesario usar join ya que el hilo está separado
    
      return 0;
    }
    

    Tenga en cuenta que después de separar un hilo, ya no es necesario llamar a pthread_join() para esperar a que salga. En su lugar, simplemente se puede retornar desde la función principal y dejar que el proceso se termine normalmente.</string.h></stdio.h></stdlib.h></pthread.h>

Comments are closed.