これはスレッド待機/パルシングの有効な実装ですか?

タイトルによれば、これは有効な実装ですか?私は lock ステートメントの問題を認識していますが、要件のために使用する必要があります。このコードは有効ですか?

lock (richTextBox)
{
    Monitor.Wait(richTextBox);
    richTextBox.AppendText("Text");
    Monitor.PulseAll(richTextBox);
}
1
これが「有効な実装」とは何を意味するのかをさらに詳しく説明できますか?コードをここに持ってくる原因と思われる問題は何ですか?例えば、 "それはコンパイルしていますか"というのは有効なコードの一つの尺度です。私はそれが コンパイルされると確信しています。しかし、それを理解するためにコンパイラを使用することができました。アルゴリズムが正しく実装されているかどうかは、試してみましたか?それは動作しましたか?あなたはどんな問題に遭遇しましたか?
追加された 著者 Merlyn Morgan-Graham,
私は人々がこの質問で少し厳しいと思っています、モニターがここでどのように働くのかについての明確な誤解があり、それは訂正を保証します。あなたが落ちる時にコメントしてください。
追加された 著者 Paul Wheeler,
この質問の弱点についての説得力のある説明に感謝します@ MerlynMorgan-Graham
追加された 著者 Paul Wheeler,

1 答え

このコードは意味をなさない。すべてのスレッドが Monitor.Wait でブロックされ、 Monitor.PulseAll を呼び出すコードブロック以外のものはリリースされないためである。通常、待機/パルスはプロデューサ/コンシューマタイプのシナリオで使用されます(つまり、1つ以上のスレッドが別のスレッドが何らかのタスクを達成するか、または何らかのデータを提供するのを待っています)。

Monitor.Enter / Monitor.Exit ではなく、 lock ステートメントの使用については、

MSDNの記事によると:

lock(obj) { ... } 

次のものと同じである必要があります。

Monitor.Enter(obj); try { ... } finally { Monitor.Exit(obj); }
2
追加された
あなたのご意見ありがとうございます - 私はMonitor.Wait/Pulseのコンセプトを理解しているかどうかを確認する必要がありました。私はWaitメソッドに関して何を意味するのかを見ています。
追加された 著者 Dot NET,
助けてくれてありがとう、私は今理解しているよ。
追加された 著者 Dot NET,
Monitor.Waitが呼び出されるとロックが解除され、他のスレッドがロックに入ることを理解することが重要です。 PulseAllが呼び出されると、以前にwaitを呼び出したスレッドはすべて解放されますが、一度に1つしかロックを再取得できないため、同時に解放されることはありません。別のスレッドがPulse/PulseAllを呼び出すと、Waitでブロックされたスレッドはレディキューに移動されますが、ロックを再度取得せずに、スレッドを終了したスレッドがロックを解除するまで(ブロックを終了するか、自分自身を待ってください。
追加された 著者 Paul Wheeler,
Monitors en.wikipedia.org/wiki/Monitor_%28synchronization%29の概念に関するウィキペディアの記事と、MonitorクラスのMSDNに関する記事:msdn.microsoft.com/en-us/library/system.threading.monitor.as&zwnj ; pxあなたはその機能についてかなりの確かな理解を得ることができます。
追加された 著者 Paul Wheeler,