2012-11-27 231 views
1

我用C \ C創建無鎖隊列++,隊列工作正常,但我得到的錯誤時,Visual Studio顯示,它是免費的運轉,並且它崩潰了此功能的Windows堆損壞C++ C

的extern 「C」 _CRTIMP INT __cdecl _CrtIsValidHeapPointer( 常量無效* pUserData)

而且這種情況發生時,尊者很多讀線程(使用自由線程),如果我刪除無它正常工作與任意數量的線程或者如果我把簡單的printf(「隨機東西」); (這有點慢),它適用於任何數量的線程。所以我只是不知道該怎麼辦:(看起來好像很多線程試圖釋放內存窗口無法處理它,這是可以解決的問題嗎?另外,當變量地址變成'magic'時, (0xABABABAB,0xCDCDCDCD ..),我發現,這些也與堆..

在linux中,使用POSIX線程沒有得到任何的問題,正常工作與任意數量的線程。

所以問題爲什麼放慢線程幫助(或這是巧合嗎?),以及如何不會減慢擺脫堆問題 有關堆內存的任何意見,歡迎

來源:? queue.c queue.h

+3

聽起來像是你有一個競爭條件,但沒有人能爲你使用的只是一個普通的,線程安全的幫你無需任何代碼 – Collin

+0

只要處理堆來實現隊列,它不是無鎖的。你使用原子進行變量訪問嗎?簡單變量賦值不會跨線程工作。無論它在測試中是否有效 - 在足夠的負載下都會失效。 – ActiveTrayPrntrTagDataStrDrvr

+0

用代碼更新。隊列工作正常,但負載很大,崩潰。並且總是在出隊方法中崩潰。 –

回答

1

我面臨類似的問題,而我試圖從MFC gui調用我的一個DLL。

你很可能得到這類問題,如果你通過靜態鏈接和其他DLL/EXE作爲對MSVC運行時動態鏈接所做的DLL之一。

它似乎靜態鏈接對MSVC運行時DLL在不同的上下文對MSVC運行時動態鏈接DLL運行,即使他們是在同一個應用程序中使用。

基本上,如果你免費或返回這是從兩個不同的上下文中創建一個指針,發生堆損壞。如果你在VS中調試程序,它不會顯示任何錯誤。但是如果你運行它,它將在退出返回上下文後顯示堆損壞錯誤。

的一種可能的解決方案是動態對MSVC運行時鏈接所有的DLL。

希望這有助於

問候