当前位置:  技术问答>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管道事件,或者采取条件变量+互斥量+标记变量的方法通知退出.

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • pthread_create成功返回,但pthread_kill(thrdid, 0)返回说进程不存在?
  • sigwait和pthread_kill的使用.只发了一个信号阿?怎么有等到两个????


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3