怎样能杀死一个未挂起线程??

时间:2022-06-26 08:25:17
应用中有两个线程, 一个任务线程,一个监控线程(监控任务线程的执行情况),任务线程主要通过oci访问数据库,在访问之前 lock,然后执行数据库,访问后unlock,但在执行数据库的函数中,长时间不能返回,监控线程就要把任务线程杀死,并解锁(防止死锁),然后再pthread_creat一个新线程去执行任务,但新线程执行到访问数据库的函数时,整个应用就被系统kill掉了, 我怀疑是我没有把前一个任务线程杀死找成的,可我又不知道怎么杀,

我用的是   pthread_cancel方法,并且state 和type 也已经设置。
且pthread.h中没有pthread_kill方法  

请问该怎么解决这个问题

6 个解决方案

#1


有可能是没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;
}

#2


我也用了 pthread_join() 函数,可是没有起作用

#3


pthread_kill在signal.h中
pthread_kill(tid, SIGKILL);

#4


但新线程执行到访问数据库的函数时,整个应用就被系统kill掉了。

这里应该检查一下旧线程是否已经正确cancel,另外可能是旧线程访问数据库的一些临时资源没有释放。

#5


用个笨办法system("kill id")

#6


引用 5 楼 hefuhua 的回复:
用个笨办法system("kill id")


这个是强制结束进程,而不是线程。

#1


有可能是没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;
}

#2


我也用了 pthread_join() 函数,可是没有起作用

#3


pthread_kill在signal.h中
pthread_kill(tid, SIGKILL);

#4


但新线程执行到访问数据库的函数时,整个应用就被系统kill掉了。

这里应该检查一下旧线程是否已经正确cancel,另外可能是旧线程访问数据库的一些临时资源没有释放。

#5


用个笨办法system("kill id")

#6


引用 5 楼 hefuhua 的回复:
用个笨办法system("kill id")


这个是强制结束进程,而不是线程。