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?
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 apthread_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 variableexitRequested
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
: