スレッドが現在所有していないロックオブジェクトでMonitor.Wait(lockObj)
を呼び出すと、SyncronizationLockException
がスローされます。Monitor.Wait()を呼び出す前にモニタを取得する必要がある理由
私はこの点を理解していませんか?スレッドがロックを所有していて、したがってMonitor.Wait()
を正常に呼び出すことができれば、それはただちにロックをただちに解放します。スレッドが現在所有していないロックを待つことができないのはなぜですか?
更新
私は私の質問に、もう少し説明を加えることにしました。
私が理解したところから、Waitは現在のスレッドをモニタの待機キューに置き、ロックを解除します。その後、パルスまたはパルスは、待ち行列の1つまたはすべてのスレッドを準備完了キューに移動します。モニターが解放されるたびに、レディー・キューの次のスレッド(存在する場合)にロックが与えられます。
なぜ、待機は単に待ち行列にスレッドを追加できませんか?なぜこれを行うにはロックを取得する必要がありますか?これに物理的な理由があるのでしょうか、またはマイクロソフトがクラスを設計して正しい方法で使用するように強制しましたか?
私はそれについて考えて、モニターの待ち行列に何かを置いたり、準備が整ったキューに何かを移動させるのが実際にモニターを操作していると思います。これを行うには自身のモニターが必要になると考えられます。それはそれについて正しい考え方ですか?
私の脳のマルチスレッドは大変です!