线程互斥等待超时, 找不到原因

cczlp 2011-09-22 12:05:01
DLL有一个线程,若干导出函数. 线程处理一块内存, 导出函数等待线程处理后输出这块内存.问题是有时候出现超时情况.
简化后下面这样:
 g_hMutex = CreateMutex(NULL, FALSE, NULL);

//DLL导出的函数
int__stdcall DllFun(BYTE *pBuf)
{
//有时候超时,有时候正常, WHY???
if (WaitForSingleObject(g_hMutex, 3000) == WAIT_OBJECT_0)
{
//memcpy(pBuf, g_Buf, dwSize);
while (ReleaseMutex(g_hMutex));
return 1;
}
return 0;
}
//线程函数
unsigned __stdcall ThreadFun(void *parm)
{
while(!g_bTermiate)
{
if (WaitForSingleObject(g_hMutex, 3000) != WAIT_OBJECT_0)
{
Sleep(2);
continue;
};
//对g_Buf进行操作, 不超过0.5秒
//.......
while (ReleaseMutex(g_hMutex));
}
return 0;
}
...全文
210 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fxworld 2011-09-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 bosman 的回复:]

ReleaseMutex(g_hMutex);//释放成功时,返回true,你的是死循环来的.
//在g_hMutex有效时,不断释放干什么?除非g_hMutex无效..
//把WaitforXXX和ReleaseXXX使用看清楚点.
[/Quote]

呵呵,你自己没弄懂,别闹笑话了。
cczlp 2011-09-25
  • 打赏
  • 举报
回复
说错也没关系, 讨论问题.
我只是确认Mutex用法没有错误就行.
要处理的数据是从硬件来的, 不能设断点调试, 实际流程也比较复杂, 有一个线程在接收数据多个线程进行后续处理.而数据有多种格式,用户任意时刻都可能发命令改变数据格式. 这几天通过LOG跟踪和分析代码,初步判断是逻辑问题导致死锁,这个死锁也不是每次都发生.
Bosman 2011-09-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fxworld 的回复:]

引用 8 楼 bosman 的回复:

ReleaseMutex(g_hMutex);//释放成功时,返回true,你的是死循环来的.
//在g_hMutex有效时,不断释放干什么?除非g_hMutex无效..
//把WaitforXXX和ReleaseXXX使用看清楚点.


呵呵,你自己没弄懂,别闹笑话了。
[/Quote]
不好意思..弄笑话了.
Bosman 2011-09-25
  • 打赏
  • 举报
回复
ReleaseMutex(g_hMutex);//释放成功时,返回true,你的是死循环来的.
//在g_hMutex有效时,不断释放干什么?除非g_hMutex无效..
//把WaitforXXX和ReleaseXXX使用看清楚点.
Bosman 2011-09-25
  • 打赏
  • 举报
回复

g_hMutex = CreateMutex(NULL, FALSE, NULL);

//DLL导出的函数
int__stdcall DllFun(BYTE *pBuf)
{
if (WaitForSingleObject(g_hMutex, 3000) == WAIT_OBJECT_0)
{
//memcpy(pBuf, g_Buf, dwSize);
ReleaseMutex(g_hMutex);
return 1;
}
return 0;
}
//以上有可能会超时
//////////////
int__stdcall DllFun(BYTE *pBuf)
{
int i=0;
while(i<3)//等待一定时间,也可以无限等待
{
if (WaitForSingleObject(g_hMutex, 3000) == WAIT_OBJECT_0)
{
//memcpy(pBuf, g_Buf, dwSize);
ReleaseMutex(g_hMutex);
return 1;
}
i++;
}
return 0;
}
/////////////
//线程函数
unsigned __stdcall ThreadFun(void *parm)
{
while(!g_bTermiate)
{
if (WaitForSingleObject(g_hMutex, 3000) != WAIT_OBJECT_0)
continue;
//对g_Buf进行操作, 不超过0.5秒
ReleaseMutex(g_hMutex);
}
return 0;
}
Bosman 2011-09-25
  • 打赏
  • 举报
回复
看你这结构问题多多..超时不奇怪..
zzbinfo 2011-09-22
  • 打赏
  • 举报
回复
你是怎么得到的这个结论呢??会不会就是因为数据处理超时了呢?你试试这个时间再长点,看超时的情况有没有减少。[Quote=引用 2 楼 cczlp 的回复:]
每次处理不会超0.5秒, 等待3秒, 不应该出现超时情况
[/Quote]
cczlp 2011-09-22
  • 打赏
  • 举报
回复
有2个地方我在怀疑, 1是不是跟CreateMutex有名字和无名字有关;2 不知道Mutex系统如何实现的,DllFun是在有窗口的消息循环中调用的,而ThreadFun中没有消息循环.
cczlp 2011-09-22
  • 打赏
  • 举报
回复
每次处理不会超0.5秒, 等待3秒, 不应该出现超时情况
我不懂电脑 2011-09-22
  • 打赏
  • 举报
回复
(WaitForSingleObject等待对方在指定时间内没有释放资源,当然会超时了
浩南_哥 2011-09-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cczlp 的回复:]

有2个地方我在怀疑, 1是不是跟CreateMutex有名字和无名字有关;2 不知道Mutex系统如何实现的,DllFun是在有窗口的消息循环中调用的,而ThreadFun中没有消息循环.
[/Quote]
跟名字应该没有关系的
很可能就是0.5秒内没有处理完数据,然后超时了。

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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