Я реализовал параллельный запущенный поток. Я хочу, чтобы каждый раз, когда пользователь нажимал кнопку, скажем «p», поток немедленно останавливался.
Мой код:
bool b=false;
pthread_t thread1=0;
void handlerforfunc3(void* arg)
{
b=true;
cout<<"Handler exited"<<endl; //this was not output when 'in the while loop' stopped printing'
}
void handler()
{
cout<<"PROCESS HAS ENTERED THE HANDLER"<<endl;
rrscheduler(ready, job);
}
void* func3(void *arg)
{
pthread_cleanup_push(handlerforfunc3, NULL);
timer(arg); //timer() is a function called in the thread
handler();
pthread_cleanup_pop(0);
}void rrscheduler()
{
pthread_create(&thread1, NULL, func3, (void*)(arg1));
}
int main()
{
while(1)
{
char c=cin.get();
switch(c)
{
case 'p':
if(thread1!=0)
{
pthread_cancel(thread1);
while(!b)
{
cout<<"in the while loop"<<endl;
}
} //thread1!=0
b=false;
rrscheduler();
}//switch ends
} //while ends
}
Происходит то, что всякий раз, когда я пытаюсь прервать, нажав «р» экран заполнен «В то время как цикл» постоянно отображается, который затем останавливается через 3-4 с. после этого не отображается ‘обработчик завершен’ и не вызывается rrscheduler. Также пока в то время как цикл‘отображается оператор из функции timer ().
Мой вопрос таков:
1. как я могу заставить поток завершить выполнение немедленно
2. Почему rrscheduler в основном не выполняется после того, как мы вышли из цикла while (после того, как b равно true)?
Похоже, что поток находится в вызове timer (), когда вы пытаетесь отменить его. Как только таймер завершит работу, его следует отменить. Согласно Страница руководства pthread_cancel ():
Функция pthread_cancel () запрашивает отмену потока. Состояние и тип отмены целевых потоков определяют, когда отмена вступит в силу. Когда отменяется действие, обработчики очистки отмены для потока называются …
Таким образом, отмена не является немедленной. В зависимости от реализации timer () может оказаться невозможным немедленно отменить поток.
Функция rrscheduler () в main () не выполняется после выхода из цикла while, потому что thread1
никогда не присваивается 0. Вы должны назначить его следующим образом:
if(thread1!=0)
{
pthread_cancel(thread1);
while(!b)
{
cout<<"in the while loop"<<endl;
}
thread1 = 0; // <== assigning to 0 here
} //thread1!=0
Других решений пока нет …