C# 在使用互斥锁时,Try-Finally-Release是否冗余;使用';?
我目前使用的是类似so的互斥体(这反过来又是so答案的一个分支):C# 在使用互斥锁时,Try-Finally-Release是否冗余;使用';?,c#,concurrency,mutex,C#,Concurrency,Mutex,我目前使用的是类似so的互斥体(这反过来又是so答案的一个分支): 如果我没有记错的话,使用在内部使用了一个try finally,因此互斥体也是如此。ReleaseMutex()在finally中是多余的,因为使用会丢弃互斥体吗?(假设互斥体dispose也会释放它)调用dispose方法时运行的代码是: protected virtual void Dispose(bool explicitDisposing) { if (this.safeWaitHandle != null)
如果我没有记错的话,
使用
在内部使用了一个try finally
,因此互斥体也是如此。ReleaseMutex()
在finally中是多余的,因为使用会丢弃互斥体吗?(假设互斥体dispose也会释放它)调用dispose
方法时运行的代码是:
protected virtual void Dispose(bool explicitDisposing)
{
if (this.safeWaitHandle != null)
{
this.safeWaitHandle.Close();
}
}
ReleaseMutex
执行的是:
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void ReleaseMutex()
{
if (!Win32Native.ReleaseMutex(base.safeWaitHandle))
{
throw new ApplicationException(Environment.GetResourceString("Arg_SynchronizationLockException"));
}
Thread.EndCriticalRegion();
Thread.EndThreadAffinity();
}
因此,您的代码不是冗余的您认为处理
互斥体
释放互斥体是错误的。处理互斥体只是告诉操作系统关闭互斥体,仅此而已
跟踪互斥锁的使用是您的工作。具体地说,获取互斥体的线程必须释放互斥体(在同一线程上),否则最终会得到一个废弃的互斥体。这实际上是Windows的要求,而不是.NET的要求。这个问题间接地回答了您的问题,并提供了更多的背景信息。不是多余的,但也不是一般的模式。当这个线程崩溃时,其他线程是否应该继续正常工作?如果没有,则保留释放,但不使用try/finally。@HenkHolterman是的,即使崩溃,其他线程也需要继续执行。
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public void ReleaseMutex()
{
if (!Win32Native.ReleaseMutex(base.safeWaitHandle))
{
throw new ApplicationException(Environment.GetResourceString("Arg_SynchronizationLockException"));
}
Thread.EndCriticalRegion();
Thread.EndThreadAffinity();
}