Do Wait Handles释放线程获取的锁定?

时间:2013-08-16 15:28:06

标签: c# .net multithreading

当我有如下所示的代码时,我的问题是,调用signal.WaitOne的线程是否释放了为另一个线程获取锁定而获取的锁定?我认为这是一个微不足道的问题要问,但我尝试搜索这样的东西并且空洞。如果有人可以对此有所了解并修改我的帖子/标题,以便将来对任何寻找此项目的人都更容易搜索,我会非常感激。

AutoResetEvent signal = new AutoResetEvent(false);

foo() {
  Monitor.Enter(locker);
  try {
       // code

       if(condition)
          signal.WaitOne();

       // code         
  } finally {
      Monitor.Exit(locker);
  }
}

编辑:我正在进行此编辑以供将来参考:

对于我想要做的事情,这似乎是一个更好的范例:

foo() {
  Monitor.Enter(locker);
  try {
       // code

       while(condition)
          Monitor.Wait(locker);

       // code         
  } finally {
      Monitor.Exit(locker);
  }
}

bar {
  lock(locker) {
      Monitor.Pulse(locker);
  }
}

1 个答案:

答案 0 :(得分:3)

没有。锁定一直持续到Exit被调用。通常,您应该尽量不要在持有锁时阻止。它增加了陷入僵局的可能性。