我想知道在使用Mutex(或Semaphores或ReadWriteLockSlims等)时,以下哪个是建议的模式。
初始锁是否应该发生在try语句的内部或外部?它不重要吗?
_mutex.WaitOne()
try
{
// critical code
}
finally
{
_mutex.ReleaseMutex();
}
或
try
{
_mutex.WaitOne()
// critical code
}
finally
{
_mutex.ReleaseMutex();
}
答案 0 :(得分:2)
这些可能不同的唯一方法是,如果在WaitOne之后但在示例1中尝试启动之前或在尝试启动之后但在示例2中的WaitOne之前发生异常。在第一种情况下,互斥锁将不会被释放并且在第二种情况下,即使没有待处理的等待,也可能会尝试释放。异常必须是像ThreadAbortException一样严重的事情才能在任何一个地方发生。但是,如果互斥锁包含在使用块中,则两者都不是问题。
编辑:在阅读了Eric关于Oliver所关注的话题的帖子之后,我认为即使使用了一个块,情况并不完美,只需按照Oliver的建议选择你的第二个版本就是你最好的选择。答案 1 :(得分:1)
也许是与众不同。看一下Eric的这些帖子:
简而言之:
试想一下mutex.WaitOne()
和try
语句之间发生异常。您将在不调用_mutex.ReleaseMutex()
的情况下留下这段代码。
因此,请使用您的第二段代码确保一切正常。
答案 2 :(得分:0)
如果您没有使用互斥锁进行跨进程同步。
请参阅此问题的答案C# - Locking issues with Mutex
然后这会更安全:
private static object _syncLock = new object();
public void RunCriticalCode()
{
lock (_syncLock)
{
// critical code
}
}