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