当前位置: 技术问答>linux和unix
怎样能杀死一个未挂起线程??
来源: 互联网 发布时间:2016-02-27
本文导语: 应用中有两个线程, 一个任务线程,一个监控线程(监控任务线程的执行情况),任务线程主要通过oci访问数据库,在访问之前 lock,然后执行数据库,访问后unlock,但在执行数据库的函数中,长时间不能返回,监...
应用中有两个线程, 一个任务线程,一个监控线程(监控任务线程的执行情况),任务线程主要通过oci访问数据库,在访问之前 lock,然后执行数据库,访问后unlock,但在执行数据库的函数中,长时间不能返回,监控线程就要把任务线程杀死,并解锁(防止死锁),然后再pthread_creat一个新线程去执行任务,但新线程执行到访问数据库的函数时,整个应用就被系统kill掉了, 我怀疑是我没有把前一个任务线程杀死找成的,可我又不知道怎么杀,
我用的是 pthread_cancel方法,并且state 和type 也已经设置。
且pthread.h中没有pthread_kill方法
请问该怎么解决这个问题
我用的是 pthread_cancel方法,并且state 和type 也已经设置。
且pthread.h中没有pthread_kill方法
请问该怎么解决这个问题
|
pthread_kill在signal.h中
pthread_kill(tid, SIGKILL);
pthread_kill(tid, SIGKILL);
|
但新线程执行到访问数据库的函数时,整个应用就被系统kill掉了。
这里应该检查一下旧线程是否已经正确cancel,另外可能是旧线程访问数据库的一些临时资源没有释放。
这里应该检查一下旧线程是否已经正确cancel,另外可能是旧线程访问数据库的一些临时资源没有释放。
|
有可能是没pthread_join的原因。
static int restart_monitor()
{
pthread_cancel(monitor_thread);
pthread_join(monitor_thread, NULL);
pthread_create(&monitor_thread, NULL, do_monitor, NULL)
return 0;
}
static int restart_monitor()
{
pthread_cancel(monitor_thread);
pthread_join(monitor_thread, NULL);
pthread_create(&monitor_thread, NULL, do_monitor, NULL)
return 0;
}
|
用个笨办法system("kill id")