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 を呼び出すと、ロックが解放され、ready-queue 内のすべてのスレッドがアクティブ化され、ロックが取得されます。したがって、ある意味でそれらはアクティブ化されますが、「パルス化」されていません。

対照的に、Wait を自発的に呼び出したスレッドは別のキューにあります。スレッドがロックを解放しただけではアクティブになりません。スレッドがレディ キューに戻る唯一の方法は、ロックされたスレッドが Pulse/PulseAll を呼び出すか、タイムアウトが発生した場合です。Pulse/PulseAllはロックを解放しないことに注意してください。これらは、スリープ キューからレディ キューへの 1 つまたは複数のスレッドにすぎません。lock2 番目の例のロックは、ステートメントを終了するときにのみ解放されます。この結果として、排他ロックを保持している間、Pulse (あなたの例ではシグナル) の後に「いくつかの作業を行う」ことに注意してください (実際には、Pulse をロックステートメントの最後に移動することもできます)。 .

于 2012-08-16T14:57:48.990 に答える
1

いいえ、しかしMonitor.Pulse()そうです。条件の状態が変化した可能性があることを通知する場合は、Monitor.Pulse() を使用しMonitor.Wait()ます。

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

于 2012-08-16T14:51:23.980 に答える