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

前端之家收集整理的这篇文章主要介绍了c – 线程中的睡眠会导致内存泄漏前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我偷看了我的祖先的代码,发现在以下情况下泄漏:

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

泄漏消息:

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

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

测试程序:

  1. UINT InitThread(LPVOID pParam)
  2. {
  3. Sleep(4000); //4000 is the default value,it reads from a registry key.
  4. CMyMFCTestProjectDlg* pTest = (CMyMFCTestProjectDlg*)pParam;
  5. pTest->DoSomething();
  6. return 0; //--> Exit thread
  7. }
  8.  
  9. BOOL CMyMFCTestProjectDlg::OnInitDialog() {
  10. ...
  11. AfxBeginThread(InitThread,this);
  12. ...
  13. }

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

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

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

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

  1. DWORD res = WaitForSingleObject(
  2. shutdownEvent,4000); // timeout
  3. if(res == WAIT_OBJECT_0)
  4. {
  5. // received the shutdownEvent,exit
  6. return 0;
  7. }
  8. // The delay has elapsed,continue with rest of thread.
  9. . . .

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

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

猜你在找的C&C++相关文章