在AfxBeginThread创建之后谁拥有CWinThread?

时间:2012-03-15 16:12:01

标签: c++ mfc

我正在使用AfxBeginThread开始一个主题。这将返回指向新CWinThread对象的指针。

MSDN声明此指针为NULL,如果线程创建失败,它将解除所有内容。但是,只要线程在定期启动后退出,CWinThread对象仍然存在。我不确定是否应该删除CWinThread对象,或者是否由MFC本身完成(虽然看起来不是这样)。

仅供参考,线程不可能退出,因为它应该在应用程序结束之前运行。但是,因为我使用它作为线程池的一部分,所以我不希望CWinThread永远挂起aorund。

3 个答案:

答案 0 :(得分:9)

清理CWinThread对象的责任取决于它的m_bAutoDelete值。默认是删除自己。对于火灾和忘记短跑线程这很好。它将自行清理。

如果您的线程长时间运行并且需要告知它是时候退出或以其他方式进行交互,那么您将希望CWinThread句柄保持有效并且不指向自我删除的对象。

如果将m_bAutoDelete设置为FALSE,则声明要删除它。要使用返回的指针安全地播放它,你应该创建暂停并将其设置为FALSE,然后按照Joseph Newcomer在他的Using Worker Threads文章中的建议重新开始。

   thread = AfxBeginThread(proc, this, 
                       THREAD_PRIORITY_NORMAL, // default: use it
                       0,     // default stack size 
                       CREATE_SUSPENDED); // let us set auto delete
   if(thread) { // protect against that rare NULL return
       thread->m_bAutoDelete = FALSE;
       thread->ResumeThread();
   }

答案 1 :(得分:4)

我从不相信CWinThread会自行清理。我经常创建线程,我告诉MFC我会进行清理,特别是当程序关闭时:

CWinThread *thread = AfxBeginThread(...); 
thread->m_bAutoDelete = FALSE;

但是,您必须保存线程指针,否则会出现内存泄漏。

答案 2 :(得分:2)

如果您的线程仍在运行,则不应删除它。一旦它停止,只需对delete返回的指针使用运算符AfxBeginThread,以释放线程使用的内存:

CWinThread *thread = AfxBeginThread(...);
/* ... */
// now wait for it to terminate
WaitForSingleObject(thread->m_hThread, INFINITE); 
delete thread;

您应该存储CWinThread指针,直到您的线程/应用程序结束,这样您就可以释放为它们分配的内存。否则,你会有内存泄漏。