1. 程式人生 > >隨筆日記: 一個daemon程式,它的pthread_join()經常意外返回, 很是奇怪!

隨筆日記: 一個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()就返回了!!!
  
  很奇怪啊...