monitor.wait发出其他线程的信号

时间:2012-08-16 14:47:57

标签: c# multithreading windows-phone-7

我正在为Windows Phone 7开发一个应用程序。现在我有2个帖子。

主题1

 lock(somelock)
 {
   //does some work 
   Monitor.Wait();
   //Does some work
 }

线程2

 lock(somelock)
 {
   //does some work
   Monitor.Signal();
   //does some work;
 }

现在我想知道Monitor.wait()是否表示另一个线程。

2 个答案:

答案 0 :(得分:2)

失败获取锁定的线程保存在就绪队列中。如果线程 锁定调用Wait,则它产生锁定,并且就绪队列中的任何线程都有资格被激活,从而获得锁定。所以以某种方式它们被激活,但它们不会“脉动”,如果这是你所说的信号。

相比之下,自愿调用Wait 的线程位于一个单独的队列中;它不会被一个产生锁的线程激活;线程返回就绪队列的唯一方法是,如果带锁的线程调用Pulse / PulseAll,或者发生超时。请注意,Pulse / PulseAll 产生锁定 - 它们只是从休眠队列到就绪队列的更多线程/线程。第二个示例中的锁仅在离开lock语句时生成。因此,请注意,在保持独占锁定的同时仍然完成脉冲(示例中的信号)之后“做一些工作”(实际上,您也可以将Pulse移动到锁定语句的末尾)

答案 1 :(得分:1)

不,但Monitor.Pulse()确实如此。如果要发出Monitor.Wait()条件状态可能已更改的信号,请使用Monitor.Pulse()。

http://www.albahari.com/threading/part4.aspx#_Signaling_with_Wait_and_Pulse