2009-09-22 17 views
39

JavaのObject.wait()は "偽の起床"に対して警告しますが、C#のMonitor.wait()はまったく言及していないようです。C#Monitor.Wait()は偽の起床に苦しんでいますか?

MonoがLinux上でどのように実装されているかを見て、Linuxにはspurious wakeupsがありますが、これはどこかに書かれていますか?

+0

「文書化する必要がありますが、悲しいことではありませんが」.NETの動作の*ロット*があります。 –

答えて

64

ジョーダフィーの"Concurrent Programming On Windows"にはこれが記載されています(P311-312、P598)。このビットは興味深いです:上記のすべての例では、スレッドがスプリアスウェイクアップと呼ばれるものに弾力的でなければならないこと

注 - 条件変数を使用するコードも、それが途中で起こされている場合に正しいと活発なままにしてくださいすなわち、求められる条件が確立される前に行われる。これは、実装が実際にそのようなことを行うためではありません(JavaやPthreadsのような他のプラットフォームの実装もそうであることは知られていますが)。また、コードが不要なときに意図的にスレッドを起動させるわけでもない。目覚めたスレッドがスケジュールされるときに保証します。条件変数は公平ではありません。アウェイクされたスレッドがロックを再取得してクリティカル領域に戻る前に、別のスレッドが関連するロックを取得して再び条件をfalseにする可能性があります。

その後、条件をテストするwhileループの通常のパターンを返します。

私はこのことから、Monitor.Waitが正常に途中であなたを起こしていないことを期待するのが妥当だと言うでしょう、そしてあなたは絶対に他に何も条件を変更していないことができるを知っているならば、あなたはすることができるかもしれないということ条件ループなしで逃げる:しかし、あなたのロジックが不正確な場合に備えて、とにかくそれを含めることは安全です。

+0

偽の目覚ましの非常に良い説明。ありがとう! – Gili

+0

Joeと直接相談して、外挿が正しいかどうか確認しています。 –

+0

ジョーはあなたにそれに戻ったのですか?同じブックの207ページに、彼は、監視するコールをブロックするなど、ブロックするたびにCLRが共通の(警告可能な)待機ルーチンを使用すると述べています。これは、あなたが言及している「明らかな」偽の起床に加えて、あなたの待機もまた、非同期プロシージャコールによって引き起こされた「本物の」睡眠覚醒の影響を受ける可能性があることを意味するでしょうか? –

関連する問題