2

我正在为 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()向另一个线程发出信号。

4

2 回答 2

2

未能获得锁的线程被保留在就绪队列中。如果锁的线程调用Wait,那么它就会产生锁,并且就绪队列中的任何线程都有资格被激活,从而获得锁。所以在某种程度上它们被激活了,但它们不是“脉冲的”,如果这就是你所说的信号的话。

相比之下,主动调用 Wait的线程在一个单独的队列中;它不会仅仅被产生锁的线程激活;线程返回就绪队列的唯一方法是,如果有锁的线程调用 Pulse/PulseAll,或者发生超时。请注意,Pulse/PulseAll不会产生锁——它们只是从睡眠队列到就绪队列的一个或多个线程。第二个例子中的锁只在离开lock语句时产生。因此,请注意,在持有独占锁的同时,Pulse(在您的示例中为 Signal)之后的“做一些工作”仍然完成(实际上,您不妨将 Pulse 移动到 lock 语句的末尾) .

于 2012-08-16T14:57:48.990 回答
1

不,但Monitor.Pulse()确实如此。当您想指示状态可能已针对某个Monitor.Wait()条件发生更改时,请使用 Monitor.Pulse()。

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

于 2012-08-16T14:51:23.980 回答