【问题标题】:Using a Mutex on an object in two methods以两种方法在对象上使用互斥锁
【发布时间】:2013-07-24 17:43:59
【问题描述】:

我的问题是,如果我在两个单独的方法中有两条关键路径,那么第二种方法中的锁是否尊重第一种方法中的锁?

例如在下面的虚拟代码中,如果method1被线程A调用,method2被线程B调用,线程B是否在进入@987654323中的关键路径之前等待线程A释放锁@?

private static readonly object mylock = new object();

public void method1()
{
    lock(mylock)
    {
         // critical path 1
    }
}

public void method2()
{
    lock(mylock)
    {
        // critical path 2
    }
}

【问题讨论】:

  • 是的,如果lock object 相同

标签: c# .net multithreading concurrency mutex


【解决方案1】:

简而言之,是的。 lock 关键字接受一个对象实例作为标识锁的标记。这并不意味着实例本身免受多线程访问的危险。相反,它仅用于唯一标识在此受保护状态下执行的一段或多段代码。使用 same 对象实例由lock 保护的两个或多个代码部分将保证以没有两个执行流临时共置的方式执行。换句话说,您的示例中的关键路径 1 和 2 保证不会同时发生,因为您使用 same 对象实例来定义代码区域。

【讨论】:

  • 锁对我来说是个问题。我开始改用 System.Threading.Mutex。或者也许我的代码有点错误......
  • @butterbox:如果在同一进程中,请使用lock,或者,如果您需要更好的控制,请使用System.Threading.Monitor(这是lock 使用的)。如果您需要跨进程,请仅使用System.Threading.Mutex
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-03-24
相关资源
最近更新 更多