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.

Matar el hilo de ejecución en curso por SIGINT.

¿Cómo podemos matar correctamente un hilo largo e infinito en ejecución mediante SIGINT?

Porque lo que estoy haciendo es:
“`
volatile sig_atomic_t exitRequested = 0;

void sigint_handler()
{
printf(“handler llamado\n”);
exitRequested = 1;
}

void* process_tickers(void* _)
{

while (1){
printf(“ticker se está ejecutando\n”);
if (exitRequested == 1)
{
break;
}
if (dec_time == -1) {
size_t bufsize = 32;
char *buffer = malloc(32);
size_t characters;
characters = getline(&buffer,&bufsize,stdin);
if (characters > 0) {
//hacer algo
}

}

}
return NULL;

}

Dentro de main, inicié la lectura haciendo:

int main() {
signal(SIGINT, sigint_handler);
pthread_t ticker_thread;
pthread_create(&ticker_thread, NULL, process_tickers, NULL);
insertRear(threads, &ticker_thread);
void **retval = NULL;
pthread_join(ticker_thread, retval);
while (1)
{
//hacer algo;
}
}

Pero no puedo matar ticker_thread con SIGINT, porque una vez que presiono Ctrl+C, se enviará SIGINT para actualizar la variable global “exitRequested”, pero dentro de la función del hilo, “getline()” solo esperará que el programa ingrese algo para que regrese al principio del bucle y luego se detenga, y para entonces el hilo se habrá completado. ¿Cómo puedo matar el hilo inmediatamente con Ctrl+C?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para matar correctamente un hilo largo y en ejecución infinita mediante SIGINT, se debe utilizar la función pthread_cancel.

    Primero, es necesario establecer el estado de cancelación para permitir la cancelación asíncrona en la función del hilo llamando a pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) al principio de la función.

    Luego, se puede utilizar pthread_testcancel para comprobar periódicamente las solicitudes de cancelación en la función del hilo. Esta función verifica si hay solicitudes de cancelación pendientes y llama a pthread_cancel si hay alguna.

    Para cancelar el hilo desde el hilo principal, se puede llamar a pthread_cancel(ticker_thread) después de establecer la variable exitRequested en 1 en el manejador de señales.

    Además, es posible que desee utilizar pthread_join para esperar a que el hilo termine antes de salir del hilo principal.

    Aquí tienes un ejemplo de cómo modificar el código para usar pthread_cancel:

    volatile sig_atomic_t exitRequested = 0;
    
    void sigint_handler()
    {
        printf("handler called\n");
        exitRequested = 1;
        pthread_cancel(ticker_thread);
    }
    
    void* process_tickers(void* _) {
        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    
        while (1){
            printf("ticker is running\n");
            pthread_testcancel();
    
            if (dec_time == -1) {
                size_t bufsize = 32;
                char *buffer = malloc(32);
                size_t characters;
                characters = getline(&buffer,&bufsize,stdin);
                if (characters > 0) {
                    //do something
                }
            }
        }
        return NULL;
    }
    
    int main() {
        signal(SIGINT, sigint_handler);
        pthread_t ticker_thread;
        pthread_create(&ticker_thread, NULL, process_tickers, NULL);
        insertRear(threads, &ticker_thread);
        void ** retval = NULL;
        pthread_join(ticker_thread, retval);
        while (1)
        {
             //do something;
        }
    }
    

Comments are closed.