在CWinThread由AfxBeginThread创建之后,谁拥有它
Who owns CWinThread after it was created by AfxBeginThread?
我正在使用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
指针,直到线程/应用程序结束,这样您就可以释放为它们分配的内存。否则,您将发生内存泄漏。
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在类定义之后定义一个私有方法
- 在 c++ 中拥有一组结构的正确方法是什么?
- 在循环C++中指定字符串之后,不会打印该字符串
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- strncpy之后的char数组的错误行为
- 计算十进制 c++ 之后的数字
- 我应该如何表示我拥有的连续元素序列?
- "x += x--"之后的 x 是什么?
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 现代 C++ 中作为类成员的非拥有指针
- 结构包含在两个头文件中,这两个文件我都不拥有
- 在函数中拥有函数原型的目的是什么?
- execlp() 在 fork() 之后无法正常工作
- condition_variable、引用和线程:谁拥有锁?
- 在CWinThread由AfxBeginThread创建之后,谁拥有它
- 如何拥有在当前类之后定义的类的变量