簡體   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