3

当我有如下所示的代码时,我的问题是调用 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);
  }
}
4

1 回答 1

3

不会。锁会一直持有,直到Exit被调用。一般来说,你应该尽量不要在持有锁的时候阻塞。它增加了死锁的机会。

于 2013-08-16T15:30:27.670 回答