当前位置: 技术问答>linux和unix
用pthread_kill(thread_id,0);判断线程是否存在 竟然产生core,为什么?
来源: 互联网 发布时间:2017-02-19
本文导语: 如题! | 提一点,可能讲的有些模糊: apache是这样工作的,用户直接通过控制程序或者脚本kill信号到pid文件里的进程ID,也就是apache的master, apache的master再将信号kill到每一个子进程或者通过dead pipe向每个子进...
如题!
|
提一点,可能讲的有些模糊:
apache是这样工作的,用户直接通过控制程序或者脚本kill信号到pid文件里的进程ID,也就是apache的master, apache的master再将信号kill到每一个子进程或者通过dead pipe向每个子进程写1字节,这是用于区别优雅退出还是非优雅退出而特意设置的。 每个子进程的main线程负责线程管理,它们接受kill信号调用信号函数设置标记以便在下一次轮询中意识到退出事件或者检测dead pipe来意识到退出, 意识到之后再根据优雅退出还是非优雅退出决定是只向listener线程唤醒条件变量还是同时向listener以及worker线程唤醒条件变量,优雅退出是唤醒listner退出后,由listener唤醒所有worker。 这里的唤醒当然包括加锁设置全局变量与brocast_cond唤醒所有线程,listener线程有一个全局变量,所有worker线程也有一个全局变量,listner和worker共享同一个互斥队列+同一个条件变量。
|
加上信号处理试试呢。
|
这句话不会引起core吧
|
测试没有问题呀。不是它产生的吧。
#include
#include
#include
#include
void *func1()
{
sleep(1);
printf("线程1(ID:0x%x)退出。n",(unsigned int)pthread_self());
pthread_exit((void *)0);
}
void *func2()
{
sleep(5);
printf("线程2(ID:0x%x)退出。n",(unsigned int)pthread_self());
pthread_exit((void *)0);
}
void test_pthread(pthread_t tid)
{
int pthread_kill_err;
pthread_kill_err = pthread_kill(tid,0);
if(pthread_kill_err == ESRCH)
printf("ID为0x%x的线程不存在或者已经退出。n",(unsigned int)tid);
else if(pthread_kill_err == EINVAL)
printf("发送信号非法。n");
else
printf("ID为0x%x的线程目前仍然存活。n",(unsigned int)tid);
}
int main()
{
int ret;
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,func1,NULL);
pthread_create(&tid2,NULL,func2,NULL);
sleep(3);
test_pthread(tid1);
test_pthread(tid2);
exit(0);
}
|
好像没什么问题,打印下pthread_kill的返回值看看吧,第二次线程不存在是否返回了ESRCH
|
楼主的代码是有问题的,不要在信号函数里做线程与进程退出相关的操作,信号函数的调用机制是依赖内核实现的,正确做法应该是信号函数内标记某个volatile sig_atomic_t的变量,在线程下一次轮询的时候发现并退出。 如果线程因为应用场景不允许轮询,那么或者采取select管道事件,或者采取条件变量+互斥量+标记变量的方法通知退出.