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
。これは、おそらく通知メカニズムの一部であることを意味します。