我不斷從內存映射文件讀取另一個進程正在寫入並使用互斥鎖來同步此操作。在我迄今爲止的一些測試中,這種方法工作得很好,但是......如果我的應用程序在獲取互斥體之後並在發佈之前崩潰了,該怎麼辦?有什麼辦法可以保證互斥體的釋放,即使在這樣的崩潰的情況下?「安全」處理互斥鎖?
另外我該如何處理另一個進程的崩潰,這可能還沒有釋放互斥量呢?每次我調用mutex.WaitOne()時,是否需要處理AbandonedMutexException?
現在我正在做與此類似:
public MyState GetState()
{
MyState state = new State();
this._mutex.WaitOne();
try
{
state.X = this._mmView.ReadSingle(0);
state.Y = this._mmView.ReadSingle(4);
[..]
}
finally
{
this._mutex.ReleaseMutex();
}
return state;
}
_mmView是MemoryMappedViewAccessor我之前實例化。整個方法GetState()被稱爲每個幀作爲遊戲循環的一部分,因此大約每幾毫秒。
PS:另外,還有沒有其他明顯的問題,爲什麼這可能會失敗,我沒有提到?
「不要編寫有史以來崩潰的程序」,或者像禪師說的那樣 - 「避免錯誤」。偉大的建議。啊哈。 – mickeyf 2012-02-07 00:03:14
雖然聽起來不太健壯也不現實。如果用戶通過任務管理器簡單地殺死進程,強行崩潰應用程序會怎樣? – Mario 2012-02-07 00:39:48
@Mario:我不知道你認爲什麼是不現實的;我向你保證,這些數據損壞錯誤會頻繁出現,如果你關心用戶數據的狀態,就必須對其進行保護。 Re:如果用戶崩潰應用程序會怎麼樣?你問我當用戶做了什麼破壞他們自己的數據會發生什麼? **他們的數據被破壞**,這就是事實。不希望自己的數據被破壞的用戶**不應該關閉他們的應用**。有一個*理由*爲什麼這樣做會出現一個對話框,指出「如果你這樣做,你可能會破壞你的數據」。 – 2012-02-07 00:43:42