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

时间:2021-11-24 07:48:47
程序很简单:
//线程指针
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来等待线程结束,这样最好。
你可以搜索一下线程控制方面的资料

#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


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

试了,还是有泄露啊

#4


引用 2 楼 dinjay 的回复:
OVERLAPPED g_HIDOverlapped = null;//全局的
然后线程处理函数中

C/C++ code

    g_HIDOverlapped.Offset = 0 ;
    g_HIDOverlapped.OffsetHigh = 0 ;
    g_HIDOverlapped.hEvent = CreateEvent( NULL,    // no sec……

关闭时,线程是挂起状态,所以Event是没有执行SetEvant()的,导致在WaitForSingleObject会死锁。
莫非关闭前只能先激活挂起的线程然后再关闭?或者说,挂起状态的关闭是线程异常关闭?

#5


因为线程里要做些标识设置,不考虑挂起程序了,因为挂起时不知道如何确定线程走到哪一步。

#1


你AfxBeginThread里面先设置为0,然后调用suspend方法挂起,再close看看有没有泄露?
一般情况下最好用信号量来控制线程,结束的时候调用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


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

试了,还是有泄露啊

#4


引用 2 楼 dinjay 的回复:
OVERLAPPED g_HIDOverlapped = null;//全局的
然后线程处理函数中

C/C++ code

    g_HIDOverlapped.Offset = 0 ;
    g_HIDOverlapped.OffsetHigh = 0 ;
    g_HIDOverlapped.hEvent = CreateEvent( NULL,    // no sec……

关闭时,线程是挂起状态,所以Event是没有执行SetEvant()的,导致在WaitForSingleObject会死锁。
莫非关闭前只能先激活挂起的线程然后再关闭?或者说,挂起状态的关闭是线程异常关闭?

#5


因为线程里要做些标识设置,不考虑挂起程序了,因为挂起时不知道如何确定线程走到哪一步。