1

特定のスレッドによって作成された特定のメモリ オブジェクトをクリーンアップしようとしています (したがって、そのスレッドにのみアクセスできます)。私がそれを達成する唯一の方法は、そのメモリブロックを解放するときにその特定のスレッドに切り替えることです。

これは、特定のメモリ コンテキストを割り当てる方法です: http://imagebin.ca/img/S6mwZBFu.jpg

これは私がやろうとしたことです:

代替テキスト http://imagebin.ca/img/DeTe9Z6h.jpg

私は元々、次のような方法でメモリ コンテキストの作成と破棄を追加しました。

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

ただし、このアプローチはうまく機能していません。つまり、「delete theCudaObj;」をクリーンアップしているときにプログラムがクラッシュします。ライン。クリーンアップ時にアクティブなスレッドを切り替えるか、CUDA コンテキストを両方のスレッドからアクセスできるように割り当てて、両方のスレッドから簡単にクリーンアップしてアクセスできるようにすることができるかどうか疑問に思っています。提案をお寄せいただきありがとうございます。

4

2 に答える 2

1

スレッド#1はスレッド#2をどのように破壊していますか?通常、TerminateThread()を使用せずに、スレッドにそれ自体を終了するように通知するのが最善です。

于 2009-11-22T01:18:08.437 に答える
0

元のアプローチは、物事を進める正しい方法のように見えます-スレッドが終了するように通知されると、ループが停止し、割り当てられたメモリがクリーンアップされます。

スレッドに終了を通知するコンテキストでは、スレッドが終了するのを待ってから、アプリケーションの終了を許可してください。途中で終了すると、クラッシュが発生する可能性があります。デバッガーをアタッチして実行し、診断のために例外がスローされたときにブレークするように設定します。

于 2009-11-22T15:45:12.397 に答える