社区
C++ 语言
帖子详情
线程退出 _unlock() 被阻塞。。。。。
shgmail
2007-10-15 06:13:26
在线程A中等待线程B退出,结果B执行return后被_unlock阻塞,导致A也退出不了,我并没调用_unlock()
程序编译设置为多线程调试DLL
谁碰到过这个情况啊
谢谢
...全文
639
20
打赏
收藏
线程退出 _unlock() 被阻塞。。。。。
在线程A中等待线程B退出,结果B执行return后被_unlock阻塞,导致A也退出不了,我并没调用_unlock() 程序编译设置为多线程调试DLL 谁碰到过这个情况啊 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
...没办法只好在等待超时时强制结束线程
不知道这个问题的原因。。。
linux_
线程
锁mutex(互斥量)_
线程
同步_死锁现象_pthread_mutex_
lock
函数_pthread_mutex_un
lock
函数_死锁现象
线程
锁,pthread_mutex_
lock
函数 pthread_mutex_un
lock
函数 当T1再次获得cpu继续 从失去cpu的位置向后写入1,当执行...un
lock
主动解锁函数,同时将
阻塞
在该锁上的所有
线程
全部唤醒,至于哪个
线程
先被唤醒,取决于优先
spin_un
lock
中的stlr如何使CPU
退出
低功耗模式?
但是,当另一个
线程
调用spin_un
lock
函数时,就会触发对应的硬件指令,如stlr,以唤醒正在等待的
线程
,使其
退出
低功耗模式。在进入低功耗模式之后,CPU会停止执行指令,并进入一个低能耗状态,以节约能量。然而,在...
linux内核编程_内核
线程
kthread_run
linux内核编程_内核
线程
kthread_run1. 简述:2. 使用示例:3. 详述: 1. 简述: 头文件: include/linux/kthread.h 数据类型: struct task_struct 宏函数: kthread_run(threadfn, data, namefmt, …) 函数: ...
Linux学习——
线程
的取消和互斥
注意:
线程
的取消要有取消点才可以,不是说取消就取消,
线程
的取消点主要是
阻塞
的系统调用 运行段错误调试: 可以使用gdb调试 使用gdb 运行代码,gdb ./youapp (gdb) run 等待出现Thread 1 "pcancel" received ...
信号同步之互斥锁(pthread_mutex_init,pthread_mutex_
lock
,pthread_mutex_un
lock
)
在Linux下,
线程
的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化: 对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init. 对于动态分配的互斥量,
C++ 语言
64,637
社区成员
250,559
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章