线程中的睡眠会导致内存泄漏

时间:2011-06-27 03:23:10

标签: c++ multithreading mfc memory-leaks

我查看了我祖先的代码,发现以下情况发生泄漏:

1)启动申请
b)启动应用程序后,在4秒内关闭应用程序

泄密信息:

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {58509} client block at 0x016DFA30, subtype c0, 68 bytes long.

随后,我通过代码,在控制工作线程功能的4个小时的睡眠中发现了可疑的原因。

测试程序:

UINT InitThread(LPVOID pParam)
{
      Sleep(4000);  //4000 is the default value, it reads from a registry key.
      CMyMFCTestProjectDlg* pTest = (CMyMFCTestProjectDlg*)pParam;
      pTest->DoSomething();  
      return 0;  //--> Exit thread
}

BOOL CMyMFCTestProjectDlg::OnInitDialog() {
...
AfxBeginThread(InitThread, this);
...
}

如果我减少/移除睡眠定时器,泄漏将被解决 但是,我想知道它是如何发生的。是由于工作线程还是GUI线程终止? GUI线程后工作线程是否会退出会导致此问题?

任何人都可以通过帮我解释一下来振作起来吗?我迷路了....

3 个答案:

答案 0 :(得分:6)

听起来工作线程在应用程序关闭后没有机会正确关闭,因为该过程在退出之前结束。操作系统通常非常善于自行清理资源,因此可能不是问题。但是,在允许应用程序关闭之前等待该线程退出可能是最好的。虽然听起来会导致应用程序关机延迟4秒。

如果这是不可接受的,则必须向线程添加一些机制,以从应用程序主线程接收关闭事件。例如,如果使用事件的WaitForSingleObject替换工作线程“sleep”:

DWORD res = WaitForSingleObject(
    shutdownEvent,
    4000); // timeout
if(res == WAIT_OBJECT_0)
{
    // received the shutdownEvent, exit
    return 0;
}
// The delay has elapsed, continue with rest of thread.
. . .

然后,当你在主线程中关闭时,设置事件,然后等待线程退出,它应该几乎立即退出:

SetEvent(this->shutdownEvent);
WaitForSingleObject(pThread->m_hThread, INFINITE); // pThread is returned from AfxBeginThread

答案 1 :(得分:4)

在进程消失之前,您应该优雅地关闭线程。您可以让主线程等待其他线程退出,或让主线程发出信号让其他线程退出。

答案 2 :(得分:0)

68个字节?

如果应用程序确实关闭了,即。已从任务管理器“应用程序”和“进程”,中消失,这种“泄漏”的唯一影响是在早期关闭时发出调试消息,只需关闭调试并忘记它。

这可能是MFC关闭的一个问题,一些结构在关机期间无法安全释放,并留给操作系统清理。

99.9%的应用程序没有不断重启/停止,即使没有清理,关闭时68字节的泄漏也不会在重启间隔之间以任何明显的方式影响Windows机器的运行每个'补丁星期二'都执行。

我确信你有更多的错误,需要处理更严重的问题。如果没有,你可以拥有我的一些!

RGDS, 马丁

相关问题