1

我正在设计一个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这可能意味着它是通知机制的一部分的函数。

4

2 回答 2

1

下载 sysinternals 工具进程浏览器。为 windows安装适当的调试工具。在进程资源管理器中,将选项 -> 符号路径设置为:

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

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

现在,您可以使用进程资源管理器检查您的程序。双击进程,转到线程选项卡,它将显示线程从哪里开始、它们有多忙以及它们当前的调用堆栈是什么。

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

于 2009-05-10T15:29:52.757 回答
1

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

于 2009-05-10T16:00:16.253 回答