等待句柄是否释放线程获取的锁?

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);
  }
}

3
signal.WaitOneMonitor 的操作没有影响... - Peter Ritchie
嗨@PeterRitchie-我已经进行了一次编辑以供将来参考。如果您能批准这个编辑,我会非常感激。 - Sandman
1
在.NET 4.0中,他们添加了一个新的Monitor.Enter(obj, ref lockTacken)。你应该使用它来替代Monitor.Enter(obj) - xanatos
1
请注意,等待句柄不是 C# 的一部分,它们是 .NET 的一部分。 - John Saunders
2
听到有人不知道编程语言和框架的区别总是让我感到震惊。试试这个实验:移除所有的“System.*”引用并构建。错误是框架的一部分。 - John Saunders
显示剩余3条评论
1个回答

3
不,锁会一直被占用直到 Exit 被调用。一般而言,你应该避免在持有锁的同时进行阻塞,因为这样会增加死锁的风险。

谢谢你的回答!非常感激。 - Sandman
嗨@mike_z。我进行了一次编辑以供将来参考。如果您能批准它,我会很感激。谢谢。 - Sandman
@Sandman,我不完全熟悉Pulse/Wait的正确用法,但我进行了一个更正。此外, lock关键字使用try/finally执行了您的Enter/Exit工作。 - Mike Zboray
谢谢你的修复。我真是太傻了,之前没有看到这个问题。 - Sandman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接