在CWinThread由AfxBeginThread创建之后,谁拥有它

Who owns CWinThread after it was created by AfxBeginThread?

本文关键字:拥有 之后 创建 CWinThread AfxBeginThread      更新时间:2023-10-16

我正在使用AfxBeginThread启动线程。这将返回一个指向新CWinThread对象的指针。

MSDN声明此指针为NULL,如果线程创建失败,它将解除分配所有内容。然而,一旦线程在正常启动后退出,CWinThread对象仍然存在。我不确定是否应该删除CWinThread对象,或者这是由MFC自己完成的(尽管看起来不是这样)。

仅供参考,线程不太可能退出,因为它应该一直运行到应用程序结束。然而,由于我使用它作为线程池的一部分,我不希望CWinThread永远挂起aorund。

清理CWinThread对象的责任取决于它的m_bAutoDelete值。默认情况是删除自身。对于火和忘记短线程,这是好的。它会自行清理的。

如果你的线程运行时间很长,需要被告知是时候退出或以其他方式与之交互了,你会希望CWinThread句柄保持有效,而不是指向自删除的对象。

如果你将m_bAutoDelete设置为FALSE,你就声称有责任删除它。为了安全起见,你应该创建一个挂起的指针,并在恢复之前将其设置为FALSE。Joseph Newcomer在他的《使用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();
   }

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

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

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

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

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

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