0

我已经实现了一个并行运行的线程。我想要的是,每当用户按下一个按钮,比如“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
}

发生的事情是,每当我尝试通过按“p”来中断时,屏幕上都会充满“在 while 循环中”,它会连续显示,然后在 3-4 秒停止。之后既不显示“处理程序退出”,也不显示调用了 rrscheduler。此外,同时显示“在 while 循环中”,还显示了来自 timer() 函数的语句。

我的问题是: 1.
我怎样才能使线程立即完成执行
2.为什么在我们退出 while 循环后(在 b 为真之后)主中的 rrscheduler 没有执行?

4

1 回答 1

1

当您尝试取消它时,看起来线程正在调用 timer() 。计时器完成后,它应该取消。根据pthread_cancel() 手册页

pthread_cancel() 函数请求取消该线程。目标线程可取消状态和类型确定取消何时生效。当取消被执行时,线程的取消清理处理程序被调用......

因此,取消不是立即的。根据 timer() 的实现,可能无法立即取消线程。

退出 while 循环后,main() 中的 rrscheduler() 函数不会执行,因为thread1它从未分配给 0。您应该按如下方式分配它:

if(thread1!=0)
{
   pthread_cancel(thread1);
   while(!b)
   {
     cout<<"in the while loop"<<endl;
   }
   thread1 = 0;  // <== assigning to 0 here
} //thread1!=0
于 2012-09-13T05:38:37.450 回答