应该在try / finally块之内或之前使用mutex.WaitOne()

时间:2010-04-30 10:09:09

标签: c# mutex

我想知道在使用Mutex(或Semaphores或ReadWriteLockSlims等)时,以下哪个是建议的模式。

初始锁是否应该发生在try语句的内部或外部?它不重要吗?

_mutex.WaitOne()
try
{
 // critical code
}
finally
{
  _mutex.ReleaseMutex();
}

try
{
  _mutex.WaitOne()
 // critical code
}
finally
{
  _mutex.ReleaseMutex();
}

3 个答案:

答案 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
    }
}