Winsock неудержимо порождает несколько постоянных потоков - PullRequest
1 голос
/ 10 мая 2009

Я разрабатываю сетевую среду, которая использует 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, что, вероятно, означает, что он является частью механизма уведомления.

Ответы [ 2 ]

1 голос
/ 10 мая 2009

Одно направление (только предположение): если это TCP-соединения, это могут быть фоновые потоки для обработки внутренних таймеров, связанных с TCP. Я не знаю, почему они использовали бы один поток на соединение, но что-то должно выполнять фоновую работу там.

1 голос
/ 10 мая 2009

Загрузить инструмент sysinternals Process Explorer . Установите соответствующие средства отладки для Windows . В проводнике процессов установите Параметры -> Путь к символам:

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

Где C: \ Websymbols - просто место для хранения кэша символов (я бы создал для него новый пустой каталог).

Теперь вы можете проверить вашу программу с помощью Process Explorer. Дважды щелкните процесс, перейдите на вкладку потоков, и он покажет вам, где начались потоки, насколько они заняты и каков их текущий стек вызовов.

Это обычно дает вам очень хорошее представление о том, что такое потоки. Если они являются внутренними потоками Winsock, я не стал бы беспокоиться о них, даже если их сотни.

...