Я разрабатываю сетевую среду, которая использует WSAEventSelect
для асинхронных операций. Я порождаю по одному потоку для каждого 64-го сокета из-за ограничения по максимуму 64 событий на поток, и все работает, как и ожидалось, за исключением одного:
При подключении и отключении потоки продолжают бесконтрольно порождаться Winsock, потоки, которые не исчезают.
С текущим дизайном структуры должны работать два потока, когда активны только несколько сокетов. И, как и ожидалось, всего работает два потока. Однако, когда я соединяюсь с несколькими сокетами (1-5 сокетов), появляются дополнительные 3 потока, которые сохраняются, пока я не закрою приложение. Кроме того, когда я теряю соединение на любом из сокетов, создаются еще 2 потока (также сохраняющиеся до закрытия). Всего 7 потоков, 5 из которых я понятия не имею, для чего они там.
Если Winsock потребует их для подключения или чего-то еще, а затем исчезнет, это будет хорошо. Но меня беспокоит, что они сохраняются, пока я не закрою свою заявку.
Есть ли кто-нибудь, кто мог бы пролить свет на это? Возможно, решение, чтобы избежать этих потоков или заставить их закрыться, когда нет активных соединений?
(Приложение написано на C ++ с Win32 и Winsock 2.2)
Информация из 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
, что, вероятно, означает, что он является частью механизма уведомления.