首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

线程互斥等待超时, 找不到原因解决方案

2012-02-17 
线程互斥等待超时, 找不到原因 - C++ Builder / Windows SDK/APIDLL有一个线程,若干导出函数. 线程处理一

线程互斥等待超时, 找不到原因 - C++ Builder / Windows SDK/API
DLL有一个线程,若干导出函数. 线程处理一块内存, 导出函数等待线程处理后输出这块内存.问题是有时候出现超时情况.
简化后下面这样:
 

C/C++ code
 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;}


[解决办法]
(WaitForSingleObject等待对方在指定时间内没有释放资源,当然会超时了
[解决办法]
你是怎么得到的这个结论呢??会不会就是因为数据处理超时了呢?你试试这个时间再长点,看超时的情况有没有减少。
探讨
每次处理不会超0.5秒, 等待3秒, 不应该出现超时情况

[解决办法]
探讨

有2个地方我在怀疑, 1是不是跟CreateMutex有名字和无名字有关;2 不知道Mutex系统如何实现的,DllFun是在有窗口的消息循环中调用的,而ThreadFun中没有消息循环.

[解决办法]
探讨

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

[解决办法]
探讨

引用:

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


呵呵,你自己没弄懂,别闹笑话了。

热点排行