线程退出 _unlock() 被阻塞。。。。。

shgmail 2007-10-15 06:13:26
在线程A中等待线程B退出,结果B执行return后被_unlock阻塞,导致A也退出不了,我并没调用_unlock()
程序编译设置为多线程调试DLL
谁碰到过这个情况啊
谢谢
...全文
639 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuming2003 2007-10-17
  • 打赏
  • 举报
回复
_free_dbg是free函数的调试版本

现在我也不确定到底是什么原因,你试试看链接其他版本的库,比如发行版本的库...
shgmail 2007-10-17
  • 打赏
  • 举报
回复
_CRTIMP void __cdecl _free_dbg(
void * pUserData,
int nBlockUse ) 的两个参数还都是零,为什么是这样呢。。。
shgmail 2007-10-17
  • 打赏
  • 举报
回复
这里不应该会被锁啊,LeaveCriticalSection咋会出现阻塞。。。
shgmail 2007-10-17
  • 打赏
  • 举报
回复
_CRTIMP void __cdecl _free_dbg(
void * pUserData,
int nBlockUse
)
{
/* lock the heap
*/
_mlock(_HEAP_LOCK);

__try {
/* allocate the block
*/
_free_dbg_lk(pUserData, nBlockUse);
}
__finally {
/* unlock the heap
*/
_munlock(_HEAP_LOCK); //应该是在这里了。。。
}
}
ontheline 2007-10-17
  • 打赏
  • 举报
回复
感觉不应该会死锁啊,如果线程函数
线程函数:
unsigned int WINAPI WorkerThread( void *pVoid )
{
//...
return 0;
}仅此而以的话,那么不可能死锁的,函数正常返回,g_hWorkerThread获得句柄
接下来WaitForsingleObject函数正常执行,不可能死锁的
可能的问题就是再线程函数中的死锁。
shgmail 2007-10-17
  • 打赏
  • 举报
回复
恩 谢谢了,暂时先用强制结束线程的办法解决下,等有机会了再弄
shgmail 2007-10-16
  • 打赏
  • 举报
回复
WSABUF wsabuf[2000];
OVERLAPPED* pOvl;
SOCKET socket;
DWORD dwIndex;
BOOL bResult;
DWORD dwTransferredBytes;
DWORD dwCount;
OVL_INFO ovlInfo;
DWORD dwSize;
DWORD dwFlag;
int iErr;
这些变量都没析构函数啊
_CRTIMP void __cdecl _free_dbg(

#endif /* _MT */

1020A052 push 4
1020A054 call _unlock (10202890h) 在调用这里的时候被阻塞了。。。
1020A059 add esp,4
$L22115:
1020A05C ret
void * pUserData,
int nBlockUse
1020A05D mov ecx,dword ptr [ebp-10h]
1020A060 mov dword ptr fs:[0],ecx
1020A067 pop edi
1020A068 pop esi
1020A069 pop ebx
1020A06A mov esp,ebp
1020A06C pop ebp
1020A06D ret
///////////////////////////////////////////////////////////////////////////////
void __cdecl _unlock (
int locknum
)
{
10202890 push ebp
10202891 mov ebp,esp
/*
* leave the critical section.
*/
LeaveCriticalSection( _locktable[locknum].lock );
10202893 mov eax,dword ptr [locknum]
10202896 mov ecx,dword ptr [eax*8+1027A100h]
1020289D push ecx
1020289E call dword ptr [__imp__LeaveCriticalSection@4 (10267038h)] 此处被阻塞
}
102028A4 pop ebp
102028A5 ret
wuming2003 2007-10-16
  • 打赏
  • 举报
回复
从你贴的代码上看好像没有问题,如果你不能贴全代码,建议你检查一下WorkerThread里面c++的局部变量的析构函数,看看有没有问题,或者打开汇编窗口,单步跟踪看看具体是阻塞在哪一条指令。
shgmail 2007-10-16
  • 打赏
  • 举报
回复
而且这个Lib放到别的地方好好的,在这不知咋就出毛病了。。。
这是个DLL工程
shgmail 2007-10-16
  • 打赏
  • 举报
回复
创建线程: g_hWorkerThread = (HANDLE) _beginthreadex( NULL, NULL, WorkerThread, NULL, NULL, (unsigned int *)&dwThreadID );

发结束事件,并等待线程:
SetEvent( g_hWorkerEvent[0]);

WaitForSingleObject( g_hWorkerThread, INFINITE );

CloseHandle( g_hWorkerThread );

线程函数:
unsigned int WINAPI WorkerThread( void *pVoid )
{
//...
return 0; 此处设断点,当收到结束事件后已经执行到这 然后就没反应了,将调试器中断看到这个线程的ID号还在说明没有结束,线程凋试窗口“位置”栏显示的是_unlock
}
这是个静态LIB工程,应该是编译器在函数退出后做了什么工作。。。但不知道是什么
herman~~ 2007-10-16
  • 打赏
  • 举报
回复
用信号量,waitfosingnalObject等待 同步喽
nkgd 2007-10-16
  • 打赏
  • 举报
回复
从你上面写的部分代码来看似乎没有问题,贴全代码吧
shgmail 2007-10-16
  • 打赏
  • 举报
回复
你这样做当然退出不了,WaitForSingleObject( g_hWorkerThread, INFINITE );
应该写在线程函数里面,你已经SetEvent了,g_肯定一直为有信号状态,线程函数当然会一直执行下去,根本起了了阻塞作用。
====================================================================
呵呵 SetEvent不是设置g_hWorkerThread,如果在线程函数里调用
WaitForSingleObject( g_hWorkerThread, INFINITE );
那么g_hWorkerThread没有退出,永远阻塞,成死锁了。。。

Seu_why 2007-10-16
  • 打赏
  • 举报
回复
再看看WaitForSingleObject和SetEvent吧
jhs1982419 2007-10-16
  • 打赏
  • 举报
回复
   另外,你的阻塞肯定是想阻塞线程函数,只有在WaitForSingleObject的第一个参数,即句柄g_hWorkerThread变为无信号状态时,g_hWorkerThread = (HANDLE) _beginthreadex( NULL, NULL, WorkerThread, NULL, NULL, (unsigned int *),线程函数才停止运行,当然这个函数也只能放在线程函数里面了.
jhs1982419 2007-10-16
  • 打赏
  • 举报
回复
   WaitForSingleObject这个函数很不容易理解,多看几遍了解下你就可以发现门道了.
jhs1982419 2007-10-16
  • 打赏
  • 举报
回复
你这样做当然退出不了,WaitForSingleObject( g_hWorkerThread, INFINITE );
应该写在线程函数里面,你已经SetEvent了,g_hWorkerThread肯定一直为有信号状态,线程函数当然会一直执行下去,根本起了了阻塞作用。
WinWing 2007-10-15
  • 打赏
  • 举报
回复
为什么不unlock
星羽 2007-10-15
  • 打赏
  • 举报
回复

你的问题描述不清楚,请附上代码阐述问题
shgmail 2007-10-15
  • 打赏
  • 举报
回复
...没办法只好在等待超时时强制结束线程
不知道这个问题的原因。。。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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