关于多线程的问题?

FinalInches 2004-12-30 07:51:29
最近写了个多线程的程序,主程序开开大概能开21个线程,(主要就是N个串口,打开,发送接收数据,串口接收,发送数据,另外的接收数据都开的有线程)每个线程结束开始的时候都有TRACE语句输出调试信息,当我在VC(声明:盗版的)编译环境下调试的时候经常出现死锁的问题,但是通过DBMON.exe来查看调试信息的时候,主程序就没有问题,不出现死锁的问题了。我的线程的结束都是通过正常的结束来完成线程关闭的,(就是一个BOOL变量,要退出的时候置FALSE,里面的事件等待都不是INFINITE,都是有超时时间的),大家认为会不会是VC编译环境的问题????讨论下,高手指导下,这里谢过先
...全文
294 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
FinalInches 2005-01-05
  • 打赏
  • 举报
回复
没人响应了???
younggle 2004-12-31
  • 打赏
  • 举报
回复
与你的情况类似, 我常常遇到,就是不是多线程也会遇到,我的VC版本是公司的,是正版的。每次遇到,只好 Stop Debug. 要说明的一点是,如果在 Stop Debug 时,要等 3 ~ 5秒钟才能 Stop 的话就说明是 VC++ 本身的问题,否则就是你程序的问题了。这是我的经验,望有所参考价值!
ilovevc 2004-12-31
  • 打赏
  • 举报
回复
你是不是Over里面总是等待第一个线程?pThread指向下一个线程了吗?
FinalInches 2004-12-31
  • 打赏
  • 举报
回复
TO: DentistryDoctor(雅克医生<改行做程序员了>)
我用Dbmon.exe(查看VC调试信息)这个工具查看的也是DEBUG版本的程序(里面有TRACE信息)
我也怀疑是我自己线程里面的Mutex之间的问题,但是我的线程都是让它正常退出的,这样他都出问题,而且出问题的线程也说不定是那个(根据TRACE语句判断的)
我的线程函数都是
UNIT(LPVOID XX)
{
bXX = TRUE;
while(bXX)
{
//...........
}
TRACE("Exit Thread\n");
return 0;
}
当我要结束这个线程的时候,是
void Over()
{
DWORD dwCode;
if (bXX)
{
bXX = FALSE;
// pThread指向我上面的线程
if (WaitForSingleObject(pThread->m_hThread,2000)== WAIT_TIMEOUT)
{
if (GetExitCodeThread(pThread->m_hThread,&dwCode)
{
if (dwCode == STILL_ACTIVE)
{
Terminater(pThread->m_hThread,0);
closeHandle(pThread->m_hThread);
TRACE("Terminate Thread");
}
}
}
pThread = NULL;
}
}
我的所有的线程都是这样退出的,因为要保证退出顺序,又不能无限等,所以就等2000,不行就Terminate,
在VC编译环境中调试这样的线程退出的时候,很容易死锁,而且根据TRACE的语句都应该是正常的结束,这个不解,用Dbmon.exe的时候,在VC死得情况下都没有死,还是不解?
另:如何用性能管理器看是那个线程死了???(性能管理器是??? 勿见笑:))
DentistryDoctor 2004-12-31
  • 打赏
  • 举报
回复
TRACE不是死锁的原因。
DEBUG/RELEASE的运行速度并不完全一样,同时在调试器中运行也会影响时序。
估计还是你自己同步的问题。
用性能管理器看看究竟死在哪个线程了。
zt209 2004-12-31
  • 打赏
  • 举报
回复
悄悄问一句
Intel 的PC机上串口物理层是用什么协议的?如果是RS-232-C,最高速率不是只能到20k吗?为什么实际上要比这个值高出好多?链路层使用的又是什么协议呢?SLIP or HDLC?
FinalInches 2004-12-31
  • 打赏
  • 举报
回复
嗯,是,我也觉得用TRACE线程容易挂,有次就遇到过,加了TRACE就死锁,消去TRACE就可以通过。。。难道真的和编译器有关系? 大家一般要结束线程都是怎么弄,如果真的非要强制关闭一个线程,用了Terminate函数,怎么善后比较好写???
FinalInches 2004-12-31
  • 打赏
  • 举报
回复
而且点Stop Debug旁边的那个Break Execute按钮的时候在底下的DEBUG观察里会输出一段话是什么:超过3秒如何如何,存在潜在的死锁(中文大意是这样,原话忘了是什么了),所以我一直都怀疑是不是我代码问题,但是感觉找不到问题,又不好调试(多个线程,同样的函数,不停的乱跳。。。。。),不知道谁有好的方法搞啊?
FinalInches 2004-12-31
  • 打赏
  • 举报
回复
嗯,是啊,每次Stop Debug的时候都要等上几秒才能退出来,不过以前在不是多线程的情况下到没怎么出现过
HunterForPig 2004-12-30
  • 打赏
  • 举报
回复
曾遇到这样,只好叹一声 无奈
delphihero 2004-12-30
  • 打赏
  • 举报
回复
调试线程就是容易死,我的单步执行就好,按F5,vc就翘了,其他机器拿过去用就好好的。你的程序正常运行不死锁就应该没问题
truewill 2004-12-30
  • 打赏
  • 举报
回复
不要用TRACE咯,似乎TRACE是比较容易挂的
试一下每个线程自己单独开个文件写log看看可不可以

15,471

社区成员

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

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