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