[英]CSocket:: Create throwing exception in my MFC application
我让我的应用程序(VC MFC)在启用了Pageheap的gflags下运行,以跟踪页面堆损坏。
现在应用程序崩溃了,它显示了此错误,我无法解释这些行(除了感到资源不可用之外)
任何人都可以弄清楚导致应用程序崩溃的原因是什么?
(信息:应用程序是在多处理器计算机上运行的约500个线程的多线程应用程序)
kernel32!RaiseException+53
msvcrt!_CxxThrowException+36
mfc42u!AfxThrowResourceException+19
mfc42u!AfxRegisterWndClass+ab
mfc42u!CAsyncSocket::AttachHandle+5c
mfc42u!CAsyncSocket::Socket+25
mfc42u!CAsyncSocket::Create+14
同样的问题使我发疯,但最终我将其修复,并且可以正常工作。 这是MFC套接字库的错误,该错误在线程[主应用程序线程以外的线程]内时,如果我们尝试执行以下操作
CSocket socket;
socket.Create();
它将引发未处理的异常。 我发现它的文章请参阅Microsoft说这个怎么样
这说了微软的话,但这也无济于事。 所以这是我找到的解决方法,我希望它可以帮助像我这样的沮丧人士。
在线程内部,执行此操作
CSocket mySock;
SOCKET sockethandle = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
mySock.m_hSocket= sockethandle;
之后,请勿调用mySock.Create,因为已经通过套接字句柄的分配创建了它。 我不确定是否可以使用mySock.Attach(sockethandle),因为我还没有尝试过。
之后,您可以直接致电Connect等。
使用完套接字后,请勿调用mySock.Close()
-而是调用closesocket(mySock.m_hSocket);
这将释放套接字对象。 如果Attach在上述情况下可以正常工作,那么我想我们在释放插座时需要在此处拆下。
祝好运
我想知道这是否是您真正的堆损坏问题,或者您的程序是否由于使用Pageheap运行而受到资源限制。
我不记得确切的详细信息,但是Pageheap会产生额外的内存开销,以至于您比不启用Pageheap时要快得多地耗尽内存。
在运行500个线程的情况下,每个线程都有1MB的堆栈,以及它们在此过程中动态分配的任何内存。
如果CAsyncSocket::AttachHandle
无法创建窗口, CAsyncSocket::AttachHandle
触发AfxThrowResourceException
。 由于Pageheap,您的系统似乎已饱和。
您是否必须运行500个线程才能重现此问题? 也许您可以稍微减少一点,那么就会有更多的可用资源。
我遇到了同样的问题,在尝试了许多事情之后,我注意到了以下CAsyncSocket参考:
创建不是线程安全的。 如果要在多线程环境中调用它(它可能被不同的线程同时调用),请确保使用互斥锁或其他同步锁来保护每个调用。
添加Mutex同步后,它不再引发异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.