当我有如下所示的代码时,我的问题是,调用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);
}
}
答案 0 :(得分:3)
没有。锁定一直持续到Exit
被调用。通常,您应该尽量不要在持有锁时阻止。它增加了陷入僵局的可能性。