dll DllEntryPoint函数中启动的线程异常停止工作的问题

oneonone 2008-03-25 04:13:07
编译环境:C++builder4

这个问题的背景是这样的:
我们公司需要封装一个有上百个函数的dll, 供另外一个公司的多线程程序调用. 所有这些函数的共同特点是需要调用远程(tuxedo中间件)上的其它接口程序. 但tuxedo中间件经常由于请求过多而发生排队, 导致另外一个公司的调用方程序一直等在那里没有响应并引发其它更严重的问题.
为了解决这个问题, 我们采取了函数调用远程中间件服务前先查看一下远程中间件排队情况的方案:
我在DLL中声明了一个全局std::map<std::string, int>, 该map中存储了当前中间件服务的队列情况, 每个函数去调用中间件的相应服务前都首先到这个map中查看队列情况, 如果排队堵塞严重则直接不调用而返回失败. 然后我在DllEntryPoint这一初始化函数中new了一个C++Builder的TTthread, 用于隔一段时间就刷新一下map.

但现在发现这样的一种现象, 这个thread在DLL刚刚载入内存后是完全正常的, 但会在一段时间后停止工作, 这段时间的长度从1小时到30小时不等. 而且我用工具程序看了一下, 发现这个线程仅仅是停止工作而非退出.

不知道哪位遇到过类似的问题, 也请各位高人帮忙分析一下原因. 谢谢!



以下是我重载的TThread的Execute方法:
void __fastcall checkqueuelength::QueueLengthThread::Execute(){
if(qlManager!=NULL){
char logStr[32];
sprintf(logStr, "TID[%#x]HANDLE[%u]_r_begin ", int(this->ThreadID), this->Handle);
qlManager->WriteLog(logStr);
}
if(Terminated && qlManager!=NULL){
qlManager->WriteLog("Terimiated singal set, thread exiting!");
}
while(!Terminated){
Sleep(checkqueuelength::QueueLengthThread::m_iSleepSeconds*1000);
/*这段注释中的代码是用来刷新全局MAP的, 但后来为了查问题, 将此处注释起来, 只留下打日志的一段代码.
但线程工作一段时间后就停止工作的情况依然存在.
if(qlManager->refreshQueueLength() == -1){//刷新失败
qlManager->WriteLog("刷新失败 resetMapTmp()");
qlManager->resetMapTmp();
}*/
qlManager->WriteLog("sleep(20)");
}
if(qlManager!=NULL){
qlManager->WriteLog("r_end");
}
}
...全文
173 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oneonone 2008-03-28
  • 打赏
  • 举报
回复
ydlchina的说法是准确的, 为了证明我的程序没问题, 我已经把循环中删除地只剩下一个writeLog, 以此来证明根本不是我自己程序中的问题.
没想到问题居然就是出在这简单的一行writeLog上, 这个函数里的问题导致线程异常挂起.
换了新的writeLog函数之后, 问题已经解决.

谢谢ydlchina和tangx100!
tangx100 2008-03-27
  • 打赏
  • 举报
回复
线程与线程之间触发的时间太短,导致循环现象
ydlchina 2008-03-26
  • 打赏
  • 举报
回复
可能Execute中的循环有问题,导致线程没有停止了工作,而循环却无法退出,
你可以做个监视线程的线程。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧