【问题标题】:Switching threads for MFC application cleanup为 MFC 应用程序清理切换线程
【发布时间】:2023-03-03 11:44:01
【问题描述】:

我正在尝试清理由特定线程创建的特定内存对象(因此只能由该线程访问)。我实现这一点的唯一方法是在释放该内存块时切换到该特定线程。

这是我分配特定内存上下文的方式: http://imagebin.ca/img/S6mwZBFu.jpg

这是我试图做的:

alt text http://imagebin.ca/img/DeTe9Z6h.jpg

我最初以如下方式添加了内存上下文的创建和销毁:

int Thread2::main()
{
     CudaMemoryContext *theCudaObj = new CudaMemoryContext();
     while(!TerminateStatus())
     {
        ...
     }
     delete theCudaObj;
     return 0;
}

但是,这种方法效果不佳,即当我清理“删除 theCudaObj;”时程序崩溃了线。我想知道是否可以在清理时切换活动线程,或者分配 CUDA 上下文以供两个线程访问,以便我可以通过两个线程轻松地清理和访问它。提前感谢您的建议。

【问题讨论】:

  • 你怎么知道如果你在另一个线程上删除会避免崩溃?在我看来,崩溃的问题与线程无关。
  • 不知道能不能避免。似乎问题在于能够在适当的内存上下文中删除 cuda 内存上下文。

标签: multithreading mfc cuda


【解决方案1】:

Thread#1 是如何破坏 Thread#2 的?通常最好发出信号让线程自行终止,而不是使用 TerminateThread()。

【讨论】:

  • 线程#1 的析构函数通过设置线程#2 的主循环检测的标志来请求线程#2 终止。但是,向线程发出信号的最佳方式是什么?为此目的创建另一个信号量或单独的邮箱?
  • 希望线程#2 的循环旨在阻止等待某种事件,否则它将不必要地占用 CPU 周期。创建一个由 Thread1 在退出之前发出信号的附加事件。 Thread1 然后在退出之前调用 WaitForSingleEvent(hThread2) 以确保 Thread2 已正确终止。
  • 我已经简要查看了msdn.microsoft.com/en-us/library/ms686915%28VS.85%29.aspx 中显示的示例但是,我不确定这是否是了解使用事件发生了什么的最简单示例。您对某些示例有什么建议吗?
  • 搜索 Joseph Newcomer 的 MVP 技巧、技术和好东西。许多 MFC 特定的东西,包括线程。
【解决方案2】:

您的原始方法看起来像是处理事情的正确方法 - 当线程发出终止信号时,它会停止循环并清理所有分配的内存。

在发出终止线程信号的上下文中,请确保在允许应用程序退出之前等待它退出。过早退出可能会导致您的崩溃。在附加调试器的情况下运行,并设置为在抛出异常以进行诊断时中断。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多