Mar*_*rio 8 c# mutex memory-mapped-files
我经常从另一个进程正在写入的内存映射文件中读取并使用互斥锁来同步此操作.到目前为止,在我的几个测试中,这个工作正常,但是...如果我的应用程序在获取互斥锁之后和释放之前崩溃了怎么办?有没有办法保证互斥锁的发布,即使发生了这样的崩溃?
另外,我如何处理其他进程的崩溃,这可能还没有释放互斥锁呢?每次调用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;
}
Run Code Online (Sandbox Code Playgroud)
_mmView是我之前实例化的MemoryMappedViewAccessor.整个方法GetState()作为游戏循环的一部分被调用每个帧,因此大约每隔几毫秒.
PS:此外,还有其他明显的问题,为什么这可能会失败,我还没有提到?
Eri*_*ert 11
Eugen的答案是正确的 - 操作系统将为您释放互斥锁.现在想一想这个事实的后果是什么:
简而言之,你正在担心错误的事情.如果我的互斥锁永远不会被释放,你不应该担心会发生什么.然后发生的最糟糕的事情是每个人都在等待,这很难过,但最终用户将重启机器.你应该担心会发生什么,如果互斥量没有得到释放,因为我经历了突变中途坠毁.在那种情况下,流程现在可能会在整个地方崩溃,用户的数据将永久损坏.
首先不要陷入这种情况.解决问题的方法是在取出互斥锁写入时不要崩溃.如果你不编写崩溃的程序,那么你不必担心它,因为它不会发生.所以只是不要编写崩溃的程序.