Пример за прекратяване на нишки

  • Създаваме нишка

  • Опитваме да я прекратим

  • Изчакваме я да приключи

pthread_create(&thread, NULL, thread_func, NULL);
pthread_cancel(thread);
pthread_join(thread, NULL);
  • Маркираме нишката като неотменима

    • ... докато работи

    • ... и докато не разрешим прекратяване

    • ... и достигнем точка за прекратяване

pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
...
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
pthread_testcancel();
  • Правим нишката отменима по всяко време

  • Но засега я маркираме в неотменяемо състояние

    • ... докато работи

    • ... и докато не разрешим прекратяване

  • Нишката се прекратяване автоматично, няма нужда да достигаме до точка за прекратяване

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
...
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);

threads-cancel.c

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
int i;
void * thread_func(void * arg)
{
  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
  for(i=0; i<4; i++)
  {
     sleep(1);
     printf("I am running verry important process %i ...\n", i+1);
  }
  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
  pthread_testcancel();
  printf("YOU WILL NOT STOP ME!!!\n");
}
int main(int argc, char * argv[])
{
  pthread_t thread;
  pthread_create(&thread, NULL, thread_func, NULL);
  while(i < 1) sleep(1);
  pthread_cancel(thread);
  printf("Requsted to cancel the thread!\n");
  pthread_join(thread, NULL);
  printf("The thread is stopped!\n");
  return EXIT_SUCCESS; // 0
}

Компилиране на програмата с изрична инструкция към компилатора да поддръжка нишки:

gcc threads-cancel.c -o threads-cancel -lpthread

Last updated