我已经实现了一个并行运行的线程。我想要的是每当用户按下一个按钮,比如'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秒后停止。< em>之后既不显示'处理程序退出'也不调用rrscheduler。此外,当显示while循环中的'时,还会显示来自timer()函数的语句。
我的问题是:
1.我可以让线程立即完成执行
2.为什么在我们离开while循环之后主要的rrscheduler没有执行(在b为真之后)?
答案 0 :(得分:1)
当您尝试取消它时,看起来该线程正在调用timer()。一旦计时器完成,它应该取消。根据{{3}}:
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