随笔日记: 一个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()就返回了!!!
很奇怪啊...
相关文章推荐
- 1.写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1 程序原型: int count_one_bits(unsigned int valu
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- 开发日记(7)如何让一个activity更新application中的数据,返回后更新呢?
- 小结:实验8 分析一个奇怪的程序
- n的阶乘;计算1!+2!+3!+4!+...+10!;编写代码,演示多个字符从两边移动,向中间汇聚;求ax^2+bx+c=0的解;写一个程序返回参数二进制中1的个数;6.求两个数的最大公约数。
- 一个小例子说明ios后台daemon程序获取iTunesstore信息
- 汇编语言(王爽)》(第九章、实验8分析一个奇怪的程序)学习笔记
- 一个小程序员的日记
- 返回一个数组升序排列后的位置信息--C#程序举例
- python 批量ping一个网段 返回结果 的程序
- 一个简单的返回顶部jQuery程序代码
- 手把手教你在Solaris上写一个daemon程序
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- 编写一个函数,返回一个int数组中存储的最大数值,并在一个简单的程序中测试这个函数。(有缺陷)
- 王爽《汇编语言》第9章 实验8 分析一个奇怪的程序
- 一个奇怪的WEB SERVICE程序
- 王爽实验8 分析一个奇怪的程序
- 博客园Blog程序中又一个奇怪问题
- 写一个函数返回参数值为1的个数 比如: 15 00001111 4个1 程序类型: int count_one_bits(unsigned int value)
- 在Fragment中点击退出按钮,退出到登录界面后(按返回键退出程序开始的时候,退出到登录界面按返回键无法退出程序,而是返回到上一个Activity,网上说是没有finish掉上一个Activity)