线程是被挂起还是被阻塞住了 如何判断???

ponydph 2015-09-29 11:45:47
在通讯程序中开辟了一个线程,这个线程在while循环中,定时更新数据库某个表的字段,代表程序是活动的。
同时执行存储过程,查询是否有表的定义做了修改。在运行中发现,这个表运行一段时间就不更新数据库代表活动的字段了。
但是也没有检测到,线程异常退出什么的,不知道是在读取数据库阻塞住了,还是被挂起了,没有看到线程结束的日志。

DWORD WINAPI ProcScan(LPVOID lpParameter)
{
global_data* p = (global_data*)lpParameter;
while(true)
{
try
{
wRet=WaitForSingleObject(p->handle_notify,1000);
if(p->exit)
{
WriteLog("程序退出");
}
else if(wRet===WAIT_OBJECT_0)
{
WriteLog("程序退出2");
}

//执行存储过程,判断表是否有变动
if(CheckDB())
{
ReadDb(); //读取数据库
}

//////////////////////////////////////////////////////////////////////////////////////////////////
TimeSpan++;
if(TimeSpan>6)
{
KeepAliveStatus(); //更新数据库某个表的字段时间,代表程序运行正常。
}




}
catch(...)
{
WriteLog("线程发生异常");
}



}

WriteLog(“线程正常退出”);


}
...全文
1032 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2015-10-08
  • 打赏
  • 举报
回复
引用 10 楼 ponydph 的回复:
[quote=引用 9 楼 worldy 的回复:] KeepAliveStatus(); 你在里面干了什么
KeepAliveStat/us() { CString sql="update test where alivetime=getdate()"; .......Execute(sql); / /更新数据库 某个字段时间。 }[/quote] 可能数据库发生死锁?
信阳毛尖 2015-10-08
  • 打赏
  • 举报
回复
存储时先保存到队列中,然后再另一个线程中去读取,读和写采用了互斥变量,保证不同时操作队列。 是否是互斥变量或者队列出现问题导致的? --------------------------------------------------------------------------------------------------------- 有可能,但是你得一步一步的去排查啊,日志大怕毛线,你的硬盘能装不下? 你仔细检查一下操作队列的两个线程之间的同步逻辑,看看有没有造成死锁的那几个必要条件
encoderlee 2015-10-08
  • 打赏
  • 举报
回复
运行程序,直到出现问题,被阻塞住时,用VisualStudio附加到进程调试,点暂停,看那个线程的调用堆栈,就知道阻塞在哪里了
ponydph 2015-09-30
  • 打赏
  • 举报
回复
引用 13 楼 lsq19871207 的回复:
个人以为应该是数据库操作出了问题,ReadDb()或者KeepAliveStatus()这两个函数出了问题导致同步卡死得不到返回,线程函数也就卡在那儿了。你仔细检查一下,确保ReadDb()和KeepAliveStatus()在数据库操作上是正确的
我也怀疑,不过由于定时执行比较频繁,这个问题是运行几天后出现的,如果都写日志可能日志文件非常大, 数据库在存储数据库的时候,采用了队列机构。 存储时先保存到队列中,然后再另一个线程中去读取,读和写采用了互斥变量,保证不同时操作队列。 是否是互斥变量或者队列出现问题导致的?
信阳毛尖 2015-09-30
  • 打赏
  • 举报
回复
个人以为应该是数据库操作出了问题,ReadDb()或者KeepAliveStatus()这两个函数出了问题导致同步卡死得不到返回,线程函数也就卡在那儿了。你仔细检查一下,确保ReadDb()和KeepAliveStatus()在数据库操作上是正确的
信阳毛尖 2015-09-30
  • 打赏
  • 举报
回复
更新函数一次也不执行,还是跑着跑着就不执行了? 你在ReadDb()和KeepAliveStatus()两句后面都加上WriteLog配合日志分析
信阳毛尖 2015-09-30
  • 打赏
  • 举报
回复
引用 8 楼 ponydph 的回复:
[quote=引用 6 楼 worldy 的回复:] 你这个线程函数,没有看到终止线程的代码,线性一直在while运行着
主动退出时,会告诉线程退出标志。 问题是,更新函数不执行了。是否由于某个异常抛出,导致线程不工作了。但是都没有监测到日志产生。[/quote] 线程里面哪能那么些啊,虽然你有退出标志,但线程没有return啊!

DWORD WINAPI ProcScan(LPVOID lpParameter)
{
	global_data*   p = (global_data*)lpParameter;
	while(true)
	{
		try
		{
			wRet=WaitForSingleObject(p->handle_notify,1000);
			if(p->exit)
			{
				WriteLog("程序退出");
				return 0;
			}
			else if(wRet===WAIT_OBJECT_0)
			{
				WriteLog("程序退出2");
				return 0;
			}

			//执行存储过程,判断表是否有变动
			if(CheckDB())
			{
				ReadDb(); //读取数据库
			}

			//////////////////////////////////////////////////////////////////////////////////////////////////
			TimeSpan++;
			if(TimeSpan>6)
			{
				KeepAliveStatus();           //更新数据库某个表的字段时间,代表程序运行正常。
			}
		}
		catch(...)
		{
			WriteLog("线程发生异常");
		}
	} 

	WriteLog(“线程正常退出”);
	return 0;
}
xian_wwq 2015-09-30
  • 打赏
  • 举报
回复
应该是线程阻塞了 方法3楼已经说了,就是在关键点打印日志
worldy 2015-09-29
  • 打赏
  • 举报
回复
你没有发出挂起的命令,怎么会挂起?
ponydph 2015-09-29
  • 打赏
  • 举报
回复
引用 9 楼 worldy 的回复:
KeepAliveStatus(); 你在里面干了什么
KeepAliveStat/us() { CString sql="update test where alivetime=getdate()"; .......Execute(sql); / /更新数据库 某个字段时间。 }
worldy 2015-09-29
  • 打赏
  • 举报
回复
KeepAliveStatus(); 你在里面干了什么
ponydph 2015-09-29
  • 打赏
  • 举报
回复
引用 6 楼 worldy 的回复:
你这个线程函数,没有看到终止线程的代码,线性一直在while运行着
主动退出时,会告诉线程退出标志。 问题是,更新函数不执行了。是否由于某个异常抛出,导致线程不工作了。但是都没有监测到日志产生。
ponydph 2015-09-29
  • 打赏
  • 举报
回复
引用 5 楼 lsq19871207 的回复:
你这线程里面是个死循环吧??
正常运行的时候,是死循环。 现在不知道为什么 KeepAliveStatus(); 函数不执行了,不更新数据库了。
worldy 2015-09-29
  • 打赏
  • 举报
回复
你这个线程函数,没有看到终止线程的代码,线性一直在while运行着
信阳毛尖 2015-09-29
  • 打赏
  • 举报
回复
你这线程里面是个死循环吧??
ponydph 2015-09-29
  • 打赏
  • 举报
回复
引用 3 楼 xiaohuh421 的回复:
打日志撒, 每执行一句, 打一个日志, 不工作的时候看执行到哪句, 如果有函数调用 , 再深入进去, 就知道是哪里问题了
加了日志,由于是周期运行的,没有全部写出来,只把怀疑有问题的异常都写了。
xiaohuh421 2015-09-29
  • 打赏
  • 举报
回复
打日志撒, 每执行一句, 打一个日志, 不工作的时候看执行到哪句, 如果有函数调用 , 再深入进去, 就知道是哪里问题了
ponydph 2015-09-29
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
你没有发出挂起的命令,怎么会挂起?
绝对没有,但是线程不知道是阻塞了,还是其他原因,没有退出日志生成,就是不工作了。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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