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

C++ CSocket::在我的MFC应用程序中创建引发异常,c++,mfc,pageheap,C++,Mfc,Pageheap,我让我的应用程序(VC MFC)运行gflags,并启用页面堆以跟踪页面堆损坏 现在应用程序崩溃了,它显示了这个错误,我无法解释这些行(除了有一种资源不可用的感觉) 有人能解释一下导致应用程序崩溃的确切原因吗 (信息:应用程序是一个多线程的应用程序,在多处理器机器上运行大约500个线程) 我想知道这是否是您实际遇到的堆损坏问题,或者您的程序是否因为使用Pageheap运行而受到资源限制 我记不清确切的细节,但Pageheap会带来额外的内存开销,以至于您可以比不启用Pageheap的情况下更快地

我让我的应用程序(VC MFC)运行gflags,并启用页面堆以跟踪页面堆损坏

现在应用程序崩溃了,它显示了这个错误,我无法解释这些行(除了有一种资源不可用的感觉)

有人能解释一下导致应用程序崩溃的确切原因吗

(信息:应用程序是一个多线程的应用程序,在多处理器机器上运行大约500个线程)


我想知道这是否是您实际遇到的堆损坏问题,或者您的程序是否因为使用Pageheap运行而受到资源限制

我记不清确切的细节,但Pageheap会带来额外的内存开销,以至于您可以比不启用Pageheap的情况下更快地耗尽内存

在500个线程运行的情况下,每个线程都有1MB的堆栈,加上它们动态分配的内存

CAsyncSocket::AttachHandle
如果无法创建窗口,将触发
AfxThrowResourceException
。由于页面堆,您的系统似乎已饱和


您是否必须运行500个线程才能重现问题?如果您可以将该计数降低一点,可能会有更多的可用资源。

我想知道这是您的实际堆损坏问题,还是您的程序由于使用Pageheap运行而刚刚达到资源限制

我记不清确切的细节,但Pageheap会带来额外的内存开销,以至于您可以比不启用Pageheap的情况下更快地耗尽内存

在500个线程运行的情况下,每个线程都有1MB的堆栈,加上它们动态分配的内存

CAsyncSocket::AttachHandle
如果无法创建窗口,将触发
AfxThrowResourceException
。由于页面堆,您的系统似乎已饱和


您是否必须运行500个线程才能重现问题?如果你能把这个数字降低一点,可能会有更多的资源可用。

同样的问题让我发疯,但最后我修复了它,它开始工作了。这是MFC套接字库的一个bug,当它位于线程(而不是主应用程序线程)内时,如果我们尝试执行以下操作

CSocket socket;
socket.Create();
它将抛出一个未处理的异常。我找到一篇关于它的文章

这句话来自微软,但对我也没有帮助。因此,我找到了一个解决办法,我希望它能帮助像我这样沮丧的人

内螺纹,这样做

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)将释放套接字对象。如果附件在上述情况下起作用,那么我想我们需要在这里进行分离,以释放插座


祝你好运

同样的问题让我发疯,但最后我解决了它,它开始工作了。这是MFC套接字库的一个bug,当它位于线程(而不是主应用程序线程)内时,如果我们尝试执行以下操作

CSocket socket;
socket.Create();
它将抛出一个未处理的异常。我找到一篇关于它的文章

这句话来自微软,但对我也没有帮助。因此,我找到了一个解决办法,我希望它能帮助像我这样沮丧的人

内螺纹,这样做

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)将释放套接字对象。如果附件在上述情况下起作用,那么我想我们需要在这里进行分离,以释放插座


祝你好运

我也遇到了同样的问题,在尝试了很多东西之后,我注意到以下CAsyncSocket参考:

创建不是线程安全的。如果您在多线程环境中调用它,而在多线程环境中,不同的线程可以同时调用它,请确保使用互斥锁或其他同步锁来保护每个调用


在添加互斥同步后,它不再抛出异常。

我也遇到了同样的问题,在尝试了许多事情之后,我注意到以下CAsyncSocket引用:

创建不是线程安全的。如果您在多线程环境中调用它,而在多线程环境中,不同的线程可以同时调用它,请确保使用互斥锁或其他同步锁来保护每个调用


添加互斥同步后,它不再抛出异常。

是的,页面堆需要更多内存,但我们需要的是堆损坏注入点。如果让我们的应用程序在这种加载状态下运行,应用程序就会崩溃。这里是另一个崩溃点,它在这个特定位置崩溃了很多实例,只要我们在高端机器(8核和4 GB RAM)mfc42u中运行应用程序!CFixedAlloc::Alloc+5c mfc42u!CString::AllocBuffer+25 mfc42u!CString::CString+3e WP_通信_服务器!CWPGenericService::AddToMessageLog+b9有任何线索吗?我们陷入此问题已超过2周。您需要完整的页面堆,还是可以尝试使用普通的per?由于您的堆已损坏,它可能会在任何地方崩溃。您从来没有回答过我的问题——是否有可能在测试期间减少线程的运行量以节省资源?还是只有在运行500个线程时才会出现这种行为?是的,页面堆需要更多内存,但我们想要的是堆损坏注入点。如果我们让我们的应用程序运行