2013-08-16 29 views
3

当我有如下所示的代码时,我的问题是如果调用signal.WaitOne的线程释放已获取另一个线程获取锁的锁定?我认为这是一个微不足道的问题,但我试图寻找这样的东西,然后空洞起来。如果有人能够阐明这一点,并修改我的帖子/标题,使其更容易搜索到任何人在未来寻找这个,我会很感激。Do Wait句柄释放线程获取的锁吗?

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.WaitOne'对'Monitor'的功能没有影响... –

+0

@PeterRitchie - 感谢您的评论! – Sandman

+0

Hi @PeterRitchie嗨,我已经编辑过未来的参考资料。如果你能批准编辑,我将不胜感激。 – Sandman

回答

3

号的锁直到调用Exit。一般来说,您应该尽量不要在锁定时阻止。它增加了僵局的可能性。

+0

感谢您的回答!欣赏它。 – Sandman

+0

嗨@mike_z。我编辑了将来的参考。如果你能批准它,我将不胜感激。谢谢。 – Sandman

+0

@Sandman我并不完全熟悉'Pulse' /'Wait'的正确用法,但我确实做了一次修正。此外,'lock'关键字用try/finally来完成'Enter' /'Exit'的工作。 –