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

 


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()就返回了!!!
  
  很奇怪啊...
  
  

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