gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:40:42 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

关于c++ - Winsock 无法控制地生成多个持久线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/845447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com