質問

私はWindows 7のC ++にマルチスレッドアプリケーションを持っています。このアプリは、別のC#アプリを使用するためのDLLとしてコンパイルされています。

マルチスレッドコードを長時間実行してストリーミングデータを処理します。このC ++コードをスタンドアロン.exeにコンパイルしてコードを実行すると、正常に機能します。

しかしDLLに変換され、C#コードが実行されると、プログラムは長い実行後にアクセス違反エラーでクラッシュします。 PythonスクリプトからDLLをロードして長時間実行すると、同様のクラッシュが表示されます。

タスクマネージャを使用して動作を見ると、システムハンドルカウントが本当に急速なペースで増加するのを見ます。約2時間のコードを実行した後、ハンドル数が300,000マークを超えて増加し続けます。

マルチスレッドコード内では、スレッドが作成されて継続的に引き下げられています。スレッドが終了したら、スレッドハンドルはCloseHandle関数によって明示的に閉じられません。これは潜在的な問題になるでしょうか?

ハンドルの問題であることを確認する方法これらのシステムリソースをより良い方法で見る方法は何ですか? 私が修正を試みる前に、試験の実行が長い時間がかかり、5時間以上が衝突を再現するためにすべての可能な解決策を知りたいのです。

役に立ちましたか?

解決

sysinternals プロセスエクスプローラプロセス内のハンドルを表示して識別することができます。スレッド、ミューテックス、ファイルなどのハンドルです。あなたは間違いなく閉鎖される必要があります()それぞれのスレッドハンドルを掃除する必要があります。

脇に、スレッドを作成するのは高価な操作です。たくさんのスレッドジョブを作成している場合は、ジョブをキューに入れて、キューを引いてジョブを実行するスレッド数の限られた数のスレッドのプールを作成することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top