繁体   English   中英

CSocket ::在我的MFC应用程序中创建引发异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM