1

少し背景:

RPCを使用してネットワーク経由で通信するWindowsプログラムに取り組んでいます。ネットワーク接続は継続的に確立および切断されます。RPC呼び出しは同期的ですが、同時に動作している複数のクライアントスレッドがあります。プログラムは対称的です。つまり、両側がクライアントとサーバーとして機能し、まったく同じソフトウェアを実行しています。これは、標準のWindowsAPIを使用してC++で実装されます。

問題:

Process Explorerによって報告されるスレッドハンドルの数は、時間の経過とともに増加します。スレッドはRPCランタイムによって要求を処理するために作成されているように見えますが、スレッドが再利用されたときにハンドルが常にクリーンアップされるとは限りません。

特に、送信するデータが多い場合や、同時に多くの通話が発生している場合に増加します(これら2つの要素は密接に関連しており、どちらが適切かはわかりません)。

アクティブなサーバーは、数日間で数千の未使用のスレッドハンドルを構築できますが、常に20を超えるスレッドを使用することはありません。

質問:

顧客のサイトで安定性の問題を引き起こしている可能性があるため、ハンドル数が増えないようにするにはどうすればよいですか?

4

1 に答える 1

0

驚くべきことに、スレッドが終了しても、すべてのリソースが解放されるわけではありません。CloseHandle()beginthreadex から受け取ったスレッド ハンドルまたはその名前を呼び出す必要があります。また、(!!!) CreateThread() を使用しないでください。MSDN ドキュメントを参照してください。

もう 1 つ問題はありませんが、それはスレッドの永続的な開始と終了です。代わりに、スレッド プールを使用してください。また、これは実際の設定によって異なります。IO 用のネットワーク インターフェイスごとに 1 つのスレッドと、計算用の CPU ごとに 1 つのスレッドのみが必要です。スレッド プールを使用すると、この数を簡単に制限できます。これらを制御下に置くことで、スレッドの作成/クリーンアップとコンテキストの切り替えによって発生するオーバーヘッドを制限する必要があります。接続がネットワーク IO、CPU、場合によってはディスク IO、さらには UI の間で頻繁に切り替わる場合、これは常に実現できるとは限りません。

于 2013-01-22T19:54:05.983 に答える