C++ Winsock无法控制地生成多个持久线程

C++ Winsock无法控制地生成多个持久线程,c++,winsock,C++,Winsock,我正在设计一个网络框架,它使用WSAEventSelect进行异步操作。由于每个线程最多64个事件的限制,我为每个第64个套接字生成一个线程,除一件事外,所有工作都按预期进行: 在连接和断开连接期间,Winsock会不可控地生成线程,这些线程不会消失 根据框架的当前设计,当只有几个套接字处于活动状态时,应该运行两个线程。正如预期的那样,总共有两个线程正在运行。但是,当我连接几个套接字(1-5个套接字)时,会产生另外3个线程,直到我关闭应用程序为止。另外,当我在任何套接字上失去连接时,会产生另外两

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

在连接和断开连接期间,Winsock会不可控地生成线程,这些线程不会消失

根据框架的当前设计,当只有几个套接字处于活动状态时,应该运行两个线程。正如预期的那样,总共有两个线程正在运行。但是,当我连接几个套接字(1-5个套接字)时,会产生另外3个线程,直到我关闭应用程序为止。另外,当我在任何套接字上失去连接时,会产生另外两个线程(也会一直持续到关闭)。总共有7个线程,其中5个我不知道它们是用来做什么的

如果Winsock要求它们进行连接或其他操作,然后它们消失了,那就好了。但让我烦恼的是,它们一直持续到我关闭应用程序为止

有人能解释一下吗?是否有一种解决方案可以避免这些线程,或者在没有连接处于活动状态时强制关闭它们

(应用程序用C++和Win32 2.2编写)< /P>


来自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
,这可能意味着它是通知机制的一部分。

下载sysinternals工具。安装适当的控制面板。在process explorer中,将选项->符号路径设置为:

SRV*C:\Websymbols*http://msdl.microsoft.com/download/symbols
其中C:\Websymbols只是一个存储符号缓存的地方(我将为它创建一个新的空目录)

现在,您可以使用process explorer检查您的程序。双击进程,转到threads选项卡,它将显示线程的起始位置、繁忙程度以及当前的调用堆栈


这通常会让您非常清楚线程是什么。如果它们是Winsock内部线程,即使有数百个,我也不会担心它们。

一个方向可以看(只是猜测):如果这些是TCP连接,它们可能是处理内部TCP相关计时器的后台线程。我不知道为什么他们会在每个连接中使用一个线程,但必须做一些后台工作。

这些线程是累积的还是可能是某个winsock内部线程池的一部分,它将这些线程保留在一个池中?@Lucero-我将运行一些测试来确定。谢谢。谢谢你的建议。我用Process Explorer中的信息更新了帖子,它似乎是用于通知机制的内部Winsock线程。很酷,看起来这些是等待内核完成端口的Winsock线程。这些线程在睡眠时几乎不消耗任何资源。所以我想这是一个一切都按设计进行的情况。