Думаю зачем это нужно и так понятно..
Мы уже научились запускать поток и ждать его завершения 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
Поток остановлен.
Как видите, теперь цикл не доработал до конца.