2010-08-02 15 views
0

我們有一個C#服務開始以非常奇怪的方式圍繞線程句柄失敗。特別是對EventWaitHandle.Reset,ReaderWriterLock調用和其他類似線程調用的調用隨機堆放在深處的Invalid Handle錯誤中。這些電話肯定是應該工作的。這可能是內存腐敗的跡象嗎?如果是這樣,我們有點困惑這是唯一的症狀,而不是崩潰。我們使用C++代碼來處理HeapFree的COM對象,並且還有一些託管代碼調用FreeHGlobal,因此可疑。有沒有人遇到類似這樣的問題,表現爲看似本地化爲線程原語的問題?C#中的無效線程句柄可能是非託管內存損壞的標誌嗎?

+0

你有一個很小但完整的代碼示例能夠重現問題嗎? – 2010-08-02 05:26:56

回答

0

原來這是一個PInvoke問題。我們錯誤地將一個線程句柄調用到C#的SafeFileHandle包裝器,它在寫入條件下會使線程句柄失效,後來由其他線程重新分配線程句柄並導致巨大的混亂。這是故事的寓意,要非常小心使用.net在P-Invoke中處理包裝類。

1

我還沒有看到這個特殊的症狀。但我認爲可以想象,原因正如您所懷疑的 - 沒有規定說內存損壞必然會導致崩潰。

試想一下,你有一個數據結構,這樣

 buffer[100]; 
    threadHandle; 

你在代碼中有一個簡單的了一個錯誤填充緩衝區。現在你的線程處理有缺陷,大概你會得到你看到的症狀。

我不太瞭解你的環境(我是Linux/Java這幾天),但可能另一個原因是線程終止後使用threadHandle?那麼句柄確實不再有效?您的終止代碼中存在某種競爭條件?