//线程指针
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)。
请问,关闭挂起状态的工作者线程会内存泄露?如何处理?
5 个解决方案
#1
你AfxBeginThread里面先设置为0,然后调用suspend方法挂起,再close看看有没有泄露?
一般情况下最好用信号量来控制线程,结束的时候调用setevent,然后通过WaitForSingleObject来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料
一般情况下最好用信号量来控制线程,结束的时候调用setevent,然后通过WaitForSingleObject来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料
#2
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;
}
#3
试了,还是有泄露啊
#4
关闭时,线程是挂起状态,所以Event是没有执行SetEvant()的,导致在WaitForSingleObject会死锁。
莫非关闭前只能先激活挂起的线程然后再关闭?或者说,挂起状态的关闭是线程异常关闭?
#5
因为线程里要做些标识设置,不考虑挂起程序了,因为挂起时不知道如何确定线程走到哪一步。
#1
你AfxBeginThread里面先设置为0,然后调用suspend方法挂起,再close看看有没有泄露?
一般情况下最好用信号量来控制线程,结束的时候调用setevent,然后通过WaitForSingleObject来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料
一般情况下最好用信号量来控制线程,结束的时候调用setevent,然后通过WaitForSingleObject来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料
#2
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;
}
#3
试了,还是有泄露啊
#4
关闭时,线程是挂起状态,所以Event是没有执行SetEvant()的,导致在WaitForSingleObject会死锁。
莫非关闭前只能先激活挂起的线程然后再关闭?或者说,挂起状态的关闭是线程异常关闭?
#5
因为线程里要做些标识设置,不考虑挂起程序了,因为挂起时不知道如何确定线程走到哪一步。