c – 线程中的睡眠会导致内存泄漏
发布时间:2020-12-16 03:43:44 所属栏目:百科 来源:网络整理
导读:我偷看了我的祖先的代码,发现在以下情况下泄漏: 1)启动申请 b)启动应用程序后,在4秒内关闭应用程序 泄漏消息: f:ddvctoolsvc7libsshipatlmfcsrcmfcthrdcore.cpp(306) : {58509} client block at 0x016DFA30,subtype c0,68 bytes long. 随后,我通过
我偷看了我的祖先的代码,发现在以下情况下泄漏:
1)启动申请 泄漏消息: f:ddvctoolsvc7libsshipatlmfcsrcmfcthrdcore.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); ... } 如果我减少/移除睡眠定时器,泄漏将被解决. 任何人都可以通过帮我解释一下来振作起来吗?我迷路了…. 解决方法
听起来工作线程没有机会在应用程序关闭后正确关闭,因为该过程在退出之前结束.操作系统通常非常善于自行清理资源,因此可能不是问题.但是,在允许应用程序关闭之前等待该线程退出可能是最好的.虽然听起来会导致应用程序关机延迟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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |