Преждевременное остановка выполнения потока Linux

Думаю зачем это нужно и так понятно..

Мы уже научились запускать поток и ждать его завершения https://how2.org.ua/art/192
Теперь давайте остановим поток. Для этого понадобится немного изменить функцию потока thread_func ну и код создания потока…

Библиотеки:

#include <stdlib.h>

#include <stdio.h>

#include <pthread.h>

#include <iostream>

Предоприделим глобальную переменную. С её помошью будем узнавать какой проход цикла в потоке выполняется:

int i = 0;

Для того чтобы иметь возможность остановить поток, но не потерять данные мы запретим завершение в начале функции потока и разрешим после выполнения цикла:

void * thread_func(void * arg){

  pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);   // запретили

  for(i=0; i < 4; i++) {   // цикл

    sleep(1);

    printf(«Поток работает!\n»);

  }

  pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);   // разрешили

  pthread_testcancel();  // проверяем выходить или нет

  printf(«Ты меня не остановишь!!!\n»);  // не будет выведено если есть сигнал о выходе

}

Теперь заполним main функцию программы:

int main(int argc, char * argv[]){

  pthread_t thread;  // идентификатор потока

  pthread_create(&thread, NULL, thread_func, NULL);  // создали

  while (i < 1) sleep(1);  // ждём как минимум 1 проход цикла

  pthread_cancel(thread);  // посылаем сигнал завершения

  printf(«cancel thread\n»);  // выводим сообщение об этом

  pthread_join(thread, NULL);  // ждём

  printf(«Поток остановлен.\n»); // зы енд

  return EXIT_SUCCESS;

}

Вывод должен быть такой:

Поток работает!

cancel thread

Поток работает!

Поток работает!

Поток работает!

Поток остановлен.

Поток «доделывает» своё дело (цикл) и только после этого происходит его завершение. Как видите последняя строка из функции потока так и не выполняется.

Можно также сделать так, чтобы поток завершался сразу после получения сигнала об этом! Вот пример такой функции потока (main — без изменения):

void * thread_func(void * arg){

  pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);

  for(i=0; i < 4; i++) {

    sleep(1);

    printf(«Поток работает!\n»);

  }

  printf(«Ты меня не остановишь!!!\n»);

}

Вывод:

Поток работает!

Поток работает!

cancel thread

Поток остановлен.

Как видите, теперь цикл не доработал до конца.

 

Похожий код:

Фото аватара
Алексей Петров

Программист, разработчик с 5 летним опытом работы. Учусь на разработчика игр на Unity и разработчика VR&AR реальности (виртуальной реальности). Основные языки программирования: C#, C++.

Оцените автора
Бла, бла код
Добавить комментарий