清理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();
}
来源
2015-05-13 21:33:03
jla
这个答案是错误的。线程终止后,'CWinThread'将关闭线程句柄,并删除它自己。因此,这段代码可能会在一个关闭的句柄上调用'WaitForSingleObject',这是未定义的行为,或者它可能试图删除一个已经被删除的对象。正确的做法是在_suspended_线程上使用'm_bAutoDelete',正如@jla的回答中所解释的。 – 2016-01-05 02:49:48