AfxBeginThread创建挂起状态的线程,直接关闭内存泄露

evan369 2010-09-30 04:05:57
程序很简单:
//线程指针
CWinThread *pThread;
//线程函数
UINT _ThreadFun(LPVOID lpArg)
{
return 0;
}
//主程序构造函数中:
pThread = AfxBeginThread(_ThreadFun,
0,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED, //挂起线程,这里改为0则退出没有内存泄露
0);
//主程序析构函数中:
::CloseHandle(pThread->m_hThread);

程序返回:
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {540} client block at 0x00DC0510, subtype c0, 68 bytes long.
a CWinThread object at $00DC0510, 68 bytes long
Object dump complete.
程序“[0xD34] TestSuspendThread.exe: 本机”已退出,返回值为 2 (0x2)。

请问,关闭挂起状态的工作者线程会内存泄露?如何处理?
...全文
469 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
evan369 2010-10-13
  • 打赏
  • 举报
回复
因为线程里要做些标识设置,不考虑挂起程序了,因为挂起时不知道如何确定线程走到哪一步。
evan369 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 dinjay 的回复:]
OVERLAPPED g_HIDOverlapped = null;//全局的
然后线程处理函数中

C/C++ code

g_HIDOverlapped.Offset = 0 ;
g_HIDOverlapped.OffsetHigh = 0 ;
g_HIDOverlapped.hEvent = CreateEvent( NULL, // no sec……
[/Quote]
关闭时,线程是挂起状态,所以Event是没有执行SetEvant()的,导致在WaitForSingleObject会死锁。
莫非关闭前只能先激活挂起的线程然后再关闭?或者说,挂起状态的关闭是线程异常关闭?
evan369 2010-09-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dinjay 的回复:]
你AfxBeginThread里面先设置为0,然后调用suspend方法挂起,再close看看有没有泄露?
一般情况下最好用信号量来控制线程,结束的时候调用setevent,然后通过WaitForSingleObject来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料
[/Quote]
试了,还是有泄露啊
dinjay 2010-09-30
  • 打赏
  • 举报
回复
OVERLAPPED g_HIDOverlapped = null;//全局的
然后线程处理函数中

g_HIDOverlapped.Offset = 0 ;
g_HIDOverlapped.OffsetHigh = 0 ;
g_HIDOverlapped.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
"model" ) ; // no name


析构中:

SetEvent(g_HIDOverlapped.hEvent);
if (m_pThreadReadPad)
{
WaitForSingleObject(m_pThreadReadPad->m_hThread, 1000);//等待线程结束
m_pThreadReadPad = NULL;
}

dinjay 2010-09-30
  • 打赏
  • 举报
回复
你AfxBeginThread里面先设置为0,然后调用suspend方法挂起,再close看看有没有泄露?
一般情况下最好用信号量来控制线程,结束的时候调用setevent,然后通过WaitForSingleObject来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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