C# 等待句柄是否释放线程获取的锁?
当我有如下所示的代码时,我的问题是调用signal.WaitOne的线程是否释放为另一个线程获取锁而获取的锁?我想这是一个很琐碎的问题,但我试着搜索类似的东西,结果却一无所获。如果有人能对此有所了解,并修改我的帖子/标题,使其在将来更易于搜索,我将不胜感激C# 等待句柄是否释放线程获取的锁?,c#,.net,multithreading,C#,.net,Multithreading,当我有如下所示的代码时,我的问题是调用signal.WaitOne的线程是否释放为另一个线程获取锁而获取的锁?我想这是一个很琐碎的问题,但我试着搜索类似的东西,结果却一无所获。如果有人能对此有所了解,并修改我的帖子/标题,使其在将来更易于搜索,我将不胜感激 AutoResetEvent signal = new AutoResetEvent(false); foo() { Monitor.Enter(locker); try { // code if(co
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);
}
}
否。在调用
Exit
之前,锁定一直保持。一般来说,你应该试着在拿着锁的时候不要阻塞。它增加了死锁的可能性。信号。WaitOne
对监视器的功能没有影响…@PeterRitchie-谢谢您的评论!在.NET4.0中,他们添加了一个新的。您应该使用它而不是监视器。输入(obj)
FYI,等待句柄不是C#的一部分。他们是.NET的一部分。听说有人不知道编程语言和框架之间的区别,我总是感到震惊。尝试以下实验:删除所有“System.*”引用并构建。错误是框架的一部分。谢谢你的回答!谢谢。嗨,迈克。我做了编辑以备将来参考。如果你能批准,我将不胜感激。谢谢。@Sandman我不完全熟悉Pulse
/Wait
的正确用法,但我确实做了一个更正。另外,lock
关键字可以通过try/finally完成Enter
/Exit
的工作。感谢您的修复。我真傻,没早点看到那件事。