我正在使用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
指针,直到线程/应用程序结束,这样您就可以释放为它们分配的内存。否则,您将发生内存泄漏。