Winsock无法控制地产生了几个持久的线程

时间:2009-05-10 14:36:52

标签: c++ winsock

我正在设计一个使用WSAEventSelect进行异步操作的网络框架。我为每个第64个套接字生成一个线程,因为每个线程限制最多64个事件,并且一切都按预期工作,除了一件事:

Winsock在连接和断开连接时,线程不受控制地产生,线程不会消失。

使用框架的当前设计,当只有少数套接字处于活动状态时,应该运行两个线程。正如预期的那样,两个线程总共在运行。但是,当我连接几个套接字(1-5个套接字)时,会产生另外3个线程,这些线程会一直存在,直到我关闭应用程序。此外,当我在任何套接字上丢失连接时,会产生另外2个线程(也会持续到关闭)。总共有7个主题,其中5个我不知道它们的用途。

如果Winsock要求连接或其他任何东西然后消失,那就没问题了。但令我感到困扰的是,在我关闭申请之前,他们一直坚持到底。

有没有人可以对此有所了解?可能是避免这些线程或在没有连接处于活动状态时强制它们关闭的解决方案?

(应用程序使用Win32和Winsock 2.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等函数,这可能意味着它是通知机制的一部分。

2 个答案:

答案 0 :(得分:1)

下载sysinternals工具process explorer。安装相应的debugging tools for windows。在进程资源管理器中,设置选项 - >符号路径:

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

其中C:\ Websymbols只是一个存储符号缓存的地方(我会为它创建一个新的空目录。)

现在,您可以使用流程资源管理器检查您的程序。双击该过程,转到threads选项卡,它将显示线程的起始位置,它们的繁忙程度以及它们当前的callstack是什么。

这通常可以让您非常了解线程是什么。如果他们是Winsock内部线程,我不会担心它们,即使有数百个。

答案 1 :(得分:1)

查看的一个方向(只是一个猜测):如果这些是TCP连接,这些可能是后台线程来处理内部TCP相关的定时器。我不知道为什么他们会为每个连接使用一个线程,但某些东西必须在那里进行后台工作。