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