2009-11-22 37 views
1

我想清理由特定線程(因此只能訪問該線程)創建的特定內存對象。我實現這一目標的唯一方法是在釋放內存塊時切換到該特定線程。爲MFC應用程序清理切換線程

我這是怎麼分配的特定內存方面: 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; 
} 

但是, ach不能很好地工作,即當我清理「delete theCudaObj」時程序崩潰了;線。我想知道是否可以在清理時切換活動線程,或者將CUDA上下文分配給兩個線程均可訪問,以便通過兩個線程清理並輕鬆訪問它。預先感謝您的建議。

+0

如何在其他線程上刪除時如何避免崩潰?在我看來,崩潰的問題與線程無關。 – 2009-11-22 00:53:33

+0

我不知道是否可以避免。看起來問題是能夠在適當的內存上下文中刪除cuda內存上下文。 – stanigator 2009-11-22 01:04:42

回答

1

線程#1是如何破壞線程#2的?通常情況下,最好發信號通知線程自行終止,而不使用TerminateThread()。

+0

線程#1的析構函數通過爲線程#2的主循環設置標誌來檢測,請求線程#2被終止。什麼是最好的方式來通知一個線程?爲此創建另一個信號量或單獨的郵箱? – stanigator 2009-11-22 01:21:45

+0

希望線程#2的循環被設計爲阻止某種事件的等待,否則它將不必要地咀嚼CPU週期。在退出之前,創建一個由Thread1發出信號的附加事件。然後,Thread1在退出之前調用WaitForSingleEvent(hThread2),以確保Thread2已正確終止。 – user216305 2009-11-22 01:40:15

+0

我簡要地查看了http://msdn.microsoft.com/en-us/library/ms686915%28VS.85%29.aspx 中顯示的示例。但是,我不確定這是否是最簡單的示例弄清楚使用事件發生了什麼。你對某些例子有什麼建議嗎? – stanigator 2009-11-22 02:03:36

0

您的原始方法看起來像是正確的方式去處理事情 - 當線程被告知終止它時停止循環並清理任何分配的內存。

在您發出線程終止信號的上下文中,請確保在允許應用程序退出之前等待它退出。過早退出可能導致你的崩潰。在附加調試器的情況下運行,並在拋出異常情況進行診斷時將其設置爲中斷。