2010-09-30 48 views
0

我有一個客戶端通過套接字連接的應用程序。該應用程序是多線程的,執行大量的數字運算,並消耗大量的內存。 (1.5 - 2 GB)偶爾它會在一個看似簡單的代碼區域拋出這個錯誤。試圖讀取或寫入受保護的內存。這通常表示其他內存已損壞

試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。

它並不總是在同一行,但它總是在同一個文件中,在foreach循環中。我想知道在VS 2008中是否有一些設置會導致它? Theres沒有任何奇怪的事情,它真的只是在一個遍歷List的foreach循環中死去。我很確定它不是一個線程問題,因爲我使用的是lock(),所以我100%確定這個列表是由多個線程同時修改的。我試過關閉編譯器優化,但它仍然每隔一段時間都會執行一次。很煩人。

這是非常罕見的發生。我在調試中運行服務器,這隻發生在每12-48小時一次。

+0

我100%確定它是一個線程或一個簡單的內存損壞問題。 – nos 2010-09-30 00:42:03

+0

這是一個純粹的C#應用​​程序?任何/不安全的代碼?任何通過pinvoke調用DLL?任何第三方類庫 – pm100 2010-09-30 00:58:28

+0

其純C#,沒有不安全的代碼。沒有第三方圖書館。我也會假設線程,但是有問題的代碼塊是用一個lock()包裝的。列表中的對象可能會被已經有引用的不同線程修改,但不是列表本身。我會假設如果它是一個線程問題,我也會看到收集修改錯誤。它實際上可能是一個不好的記憶棒? – Nathan 2010-09-30 13:30:03

回答

1

「Theres沒有什麼奇怪的,它真的只是在迭代List的foreach循環中死掉。 - 這聽起來像是一個線程同步問題。 (實際上,我可以保證它是99%!)

如果您有其他線程在迭代它時試圖修改它,您可能需要獲取該列表的副本。

建議你發佈一些代碼。

+0

該代碼塊用一個lock()包裝,所以我確信列表正在被修改。列表中的對象可能是通過已經有引用的線程。此外,它永遠不會拋出一個集合修改錯誤,所以如果它是另一個線程修改列表,我會認爲這也會發生。 – Nathan 2010-09-30 13:28:03

相關問題