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