1

WSAEventSelect非同期操作に使用するネットワークフレームワークを設計しています。スレッドあたりの最大イベント数が64であるため、64番目のソケットごとに1つのスレッドを生成します。ただし、次の1つを除いて、すべてが期待どおりに機能します。

スレッドは、接続および切断中にWinsockによって制御不能に生成され続け、スレッドは消えません。

フレームワークの現在の設計では、アクティブなソケットが数個しかない場合に2つのスレッドを実行する必要があります。そして予想通り、合計2つのスレッドが実行されています。ただし、いくつかのソケット(1〜5ソケット)で接続すると、アプリケーションを閉じるまで持続する追加の3つのスレッドが生成されます。また、いずれかのソケットで接続が失われると、さらに2つのスレッドが生成されます(これも閉じられるまで持続します)。これは合計7つのスレッドであり、そのうち5つは何のためにあるのかわかりません。

Winsockが接続などに必要とし、その後消えた場合は、それで問題ありません。しかし、アプリケーションを閉じるまでそれらが持続するのは気になります。

これに光を当てることができる人はいますか?おそらく、これらのスレッドを回避するか、アクティブな接続がないときにスレッドを強制的に閉じるための解決策ですか?

(アプリケーションは、Win32およびWinsock2.2を使用してC++で記述されています)


Process Explorerからの情報:

予想されるスレッド:
MyApp.exe!WinMainCRTStartup
MyApp.exe!Netfw :: NetworkThread :: ThreadProc

予期しないスレッド:
ntdll.dll!RtlpUnWaitCriticalSection + 0x2dc
mswsock.dll + 0x7426
ntdll.dll!RtlGetCurrentPeb + 0x155
ntdll.dll!RtlGetCurrentPeb + 0x155
ntdll.dll!RtlGetCurrentPeb + 0x155

予期しないスレッドはすべて、関数への呼び出しを含む呼び出しスタックを持っていますntkrnlpa.exe!IoSetCompletionRoutineEx+0x46e。これは、おそらく通知メカニズムの一部であることを意味します。

4

2 に答える 2

1

sysinternalsツールのProcessExplorerをダウンロードしますWindows用の適切なデバッグツールをインストールします。Process Explorerで、[オプション]->[シンボルパス]を次のように設定します。

SRV*C:\Websymbols*http://msdl.microsoft.com/download/symbols

ここで、C:\ Websymbolsは、シンボルキャッシュを格納する場所にすぎません(新しい空のディレクトリを作成します)。

これで、ProcessExplorerを使用してプログラムを検査できます。プロセスをダブルクリックして[スレッド]タブに移動すると、スレッドが開始された場所、スレッドのビジー状態、現在のコールスタックが表示されます。

これにより、通常、スレッドが何であるかについて非常に良いアイデアが得られます。Winsockの内部スレッドであれば、何百もあるとしても心配する必要はありません。

于 2009-05-10T15:29:52.757 に答える
1

調べる一方向(推測):これらがTCP接続である場合、これらは内部TCP関連タイマーを処理するためのバックグラウンドスレッドである可能性があります。なぜ接続ごとに1つのスレッドを使用するのかわかりませんが、そこでバックグラウンド作業を行う必要があります。

于 2009-05-10T16:00:16.253 に答える