// threadA.c
int main() {
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if (res != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
sleep(3);
printf("Canceling thread...\n");
res = pthread_cancel(a_thread);
if (res != 0) {
perror("Thread cancelation failed");
exit(EXIT_FAILURE);
}
printf("Waiting for thread to finish...\n");
res = pthread_join(a_thread, &thread_result);
if (res != 0) {
perror("Thread join failed");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
int i, res, j;
res = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
if (res != 0) {
perror("Thread pthread_setcancelstate failed");
exit(EXIT_FAILURE);
}
res = pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
if (res != 0) {
perror("Thread pthread_setcanceltype failed");
exit(EXIT_FAILURE);
}
printf("thread_function is running\n");
for(i = 0; i < 10; i++) {
printf("Thread is still running (%d)...\n", i);
sleep(1);
}
pthread_exit(0);
}
salida es la siguiente:cómo se cancela el hilo POSIX niño
$ ./threadA
thread_function is running
Thread is still running (0)...
Thread is still running (1)...
Thread is still running (2)...
Canceling thread...
Waiting for thread to finish...
$
Al terminar de esperar 3 segundos, el hilo principal emite el pthread_cancel comando para detener el hilo hijo y el hilo niño realmente comienza a Responda la cancelación después de invocar el comando pthread_join.
Por el momento, el hilo principal corre a la línea inmediatamente después pthread_join, el hilo hijo se está ejecutando dentro del bucle del código siguiente,
for(i = 0; i < 10; i++) {
printf("Thread is still running (%d)...\n", i);
sleep(1);
}
no veo ninguna declaración de cheques dentro de este bucle , pero el hilo principal todavía puede cancelar el hilo hijo. Supongo que el sistema POSIX multihilo tiene un sistema de verificación interno para que pueda terminar la cadena secundaria cuando se llama pthread_join en la cadena principal.
Pregunta>
Básicamente, lo necesario para comprender cómo el hilo hijo puede ser cancelado dentro del bucle sin que ella misma la comprobación de cualquier indicador.
Además, corrija mi descripción si algo está mal.
'pthread_setcanceltype' y' pthread_setcancelstate' no son puntos de cancelación. El estado de cancelación solo se verifica en los puntos de cancelación, a menos que el tipo de cancelación sea asincrónico, en cuyo caso * MAYO * se puede verificar en otros puntos e interrumpir el código de forma asíncrona (pero no es obligatorio). –
@R ..: Buen punto. Editó la respuesta en consecuencia. Gracias. –