2011-12-18 5 views
-1

タイトルによれば、これは有効な実装ですか?私はlockステートメントの問題を認識していますが、要件のために使用する必要があります。このコードは有効ですか?すべてのスレッドがMonitor.Waitにブロックされますので、これはスレッド待機/パルシングの有効な実装ですか?

lock (richTextBox) 
{ 
    Monitor.Wait(richTextBox); 
    richTextBox.AppendText("Text"); 
    Monitor.PulseAll(richTextBox); 
} 
+1

あなたは手段「これは有効な実装である」何より詳細に説明できますか?コードをここに持ってくる原因と思われる問題は何ですか?たとえば、 "does it * compile *"は有効なコードの1つの尺度です。私はそれがコンパイルされると確信しています。しかし、それを理解するためにコンパイラを使用することができました。アルゴリズムが正しく実装されているかどうかは、試してみましたか?それは動作しましたか?あなたはどんな問題に遭遇しましたか? –

+1

私は人々がこの質問で少し厳しくなっていると思う、ここでどのようにモニターが働くのかという明確な誤解があり、それは訂正を保証する。あなたが落ちる時にコメントしてください。 –

+0

この質問の弱点についての丁寧な説明には、@ MerlynMorgan-Grahamに感謝します。 –

答えて

2

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

Monitor.Enter/Monitor.Exitではなく、lockステートメントの使用に関する質問がある場合は、その部分は問題ありません。 MSDNの記事によると

lock(obj) { ... } 

が同じでなければなりません:

Monitor.Enter(obj); try { ... } finally { Monitor.Exit(obj); } 
+0

あなたのご意見ありがとうございます - 私はMonitor.Wait/Pulseのコンセプトを理解しているかどうかを確認する必要がありました。私はWaitメソッドに関して何を意味するのかを見ています。 –

+0

Monitor.Waitが呼び出されると、ロックが解放され、他のスレッドがロックに入ることを理解することが重要です。 PulseAllが呼び出されると、以前にwaitを呼び出したスレッドはすべて解放されますが、一度に1つしかロックを再取得できないため、同時に解放されることはありません。別のスレッドがPulse/PulseAllを呼び出すと、Waitでブロックされたスレッドはレディキューに移動されますが、ロックを再度取得せずに、スレッドを終了したスレッドがロックを解除するまで(ブロックを終了するか、 –

+0

Monitors en.wikipedia.org/wiki/Monitor_%28synchronization%29の概念に関するwikipediaの記事と、MonitorクラスのMSDNに関する記事:msdn.microsoft.com/en-us/library/system.threading .monitor.aspxあなたは彼らの機能をかなりよく理解することができます。 –

関連する問題