dll DllEntryPoint函数中启动的线程异常停止工作的问题
编译环境: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");
}
}