在AfxBeginThread创建之后谁拥有CWinThread?

Ale*_*lex 6 c++ mfc

我正在使用开始一个线程AfxBeginThread.这将返回指向新CWinThread对象的指针.

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

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

jla*_*jla 9

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

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

如果将m_bAutoDelete设置为FALSE,则声明要删除它.为了安全地使用返回的指针,你应该创建suspened并将其设置为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();
   }
Run Code Online (Sandbox Code Playgroud)

  • 这是唯一正确的答案.另外两个答案是错误的,可能会导致未定义的行为. (2认同)