您的位置:首页 > 理论基础 > 计算机网络

随笔日记: 一个daemon程序,它的pthread_join()经常意外返回, 很是奇怪!

2011-09-01 17:25 302 查看
 

TcpServer_Listener::Initialize() {

  ...

    pthread_create(&_ptThreadHandleAccept, NULL, AcceptThread, (void *)this);

}

void*

TcpServer_Listener::AcceptThread(void* pParam)

{

    pthread_detach(pthread_self());

    dbg_Printf(" TcpServer_Listener::AcceptThread Pid=%d.", getpid());    //print pthread_t is meaningless!

    TcpServer_Listener *pListener = reinterpret_cast<TcpServer_Listener *>(pParam);

    pListener->_bRunning = true;

    pListener->AcceptFunc();

    dbg_Printf(" TcpServer_Listener::AcceptThread Pid=%d exit.\n", getpid()); 

    return 0; // We never reach this point

}   

TcpServerListener::AcceptFunc(void)

{

    dbg_Printf("TcpServer_Listener enter listening loop");          // (1)

    while(true) {

        // 用 select 函数监听并接受连接

        // 如果有错误发生, 执行 break;

 }

    dbg_Printf("TcpServer_Listener enter listening loop");          // (2)

 return;



void TcpServer_Listener::WaitAcceptThreadEnding()

{

    if(_ptThreadHandleAccept != 0) {

        pthread_join(_ptThreadHandleAccept, NULL);

        dbg_Printf(" Accept(listening) thread finished!");                 // (3)

    }

}

int main(int argc, char* argv[]) {

       

  ... //do other jobs

  

 CdnDir_Listner  listener;

 if (!listener.Initialized(CDN_DIR_IP, CDN_DIR_PORT)) {

        dbg_Printf("Server exit because failed creating listener");

        return 1;

    }

    dbg_Printf("Server running...");                                                       // (4)

    listener.WaitAcceptThreadEnding();

 return 0;

}

   现在运行中遇到一个问题, 偶发的:

       AcceptThread 线程还没有退出( 从代码(2)处的 log没有打印出来看出来的 ),

   但是, 整个main程序会没等到 AcceptThread 结束就退出了,打印出了代码(3)处的log。

  

  

   下面的两组信息分别是正确时、 错误时的:

  

   正确时的:

/home/work # ./cdn_dir_daemon &

     。。。    。。。

[ cdn_dir_daemon_c2 info ] [FILE: cdn_dir.cpp, Func: main() ]Server running...

[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptThread() ] TcpServer_Listener::AcceptThread Pid=11143.

[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptFunc() ] TcpServer_Listener enter listening loop

    出错时的:

/home/work # ./cdn_dir_daemon &

   。。。    。。。

[ cdn_dir_daemon_c2 info ] [FILE: cdn_dir.cpp, Func: main() ]Server running...

[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptThread() ] TcpServer_Listener::AcceptThread Pid=11130.

[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: AcceptFunc() ] TcpServer_Listener enter listening loop

[ cdn_dir_daemon_c2 info ] [FILE: bxLite_tcp_utils.cpp, Func: WaitAcceptThreadEnding() ] Accept(listening) thread finished!

       怎么会这么就退出了呢??? 

   

    如果AcceptFunc中没有发生socket错误,那么AcceptThread是不会退出的。

   

    可是我在AcceptFunc中会发生socket错误的地方都有log打印。而看到的出错时的log并没有看到。

 

        我后来在AcceptFunc中用 try{}catch(...) { dbg_Print("A unknown exception happen")} , 也是没看到AcceptThread线程退出而pthread_join()就返回了!!!

  

  很奇怪啊...

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐