代码之家  ›  专栏  ›  技术社区  ›  chillitom Cee McSharpface

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

  •  3
  • chillitom Cee McSharpface  · 技术社区  · 14 年前

    我想知道在使用互斥(或信号量或读写锁存等)时,下面哪一个是建议的模式。

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

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

    try
    {
      _mutex.WaitOne()
     // critical code
    }
    finally
    {
      _mutex.ReleaseMutex();
    }
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Oliver    14 年前

    也许是另一种情况。看看埃里克的这些帖子:

    简而言之: 想象一下在 mutex.WaitOne() 以及 try 语句。您将保留这段代码而不调用 _mutex.ReleaseMutex() .

    所以,使用第二段代码来确保一切都按预期工作。

        2
  •  2
  •   Daniel Renshaw    14 年前

    唯一不同的方法是,如果在示例1中的waitone之后、try start之前或try start之后、但在示例2中的waitone之前发生异常。在第一种情况下,不会释放互斥体,在第二种情况下,可能会尝试释放互斥体,即使没有挂起的等待。例外情况必须是一些严重的事情,如在任何一个地方都会发生线程异常。但是,如果互斥体包含在using块中,这两个都不是问题。

    编辑:在阅读了埃里克关于奥利弗链接到的这个主题的文章之后,我认为即使有一个使用块,情况也不完美,按照奥利弗的建议,简单地使用第二个版本也是你最好的选择。

        3
  •  0
  •   Community basarat    7 年前

    如果您不使用互斥进行跨进程同步。

    查看此问题的答案 C# - Locking issues with Mutex

    这样会更安全:

    private static object _syncLock = new object();
    
    public void RunCriticalCode()
    {
        lock (_syncLock)
        {
            // critical code
        }
    }