問題タブ [abandonedmutexexception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 名前付き.NETミューテックスが破棄されたときにAbandonedMutexExceptionをスローしないのはなぜですか?
AbandonedMutexException
.NETミューテックスが待機中のスレッドの1つにスローしないか、Mutex.Dispose()
呼び出されたときにミューテックスを解放しない理由がわかりません。
特に、このようなコードはデッドロックします。
念のために言っておきますが、AbandonedMutexException
通常は基盤となるWIN32ミューテックスに由来し、ネイティブコードでは、所有するスレッドが停止した場合にのみトリガーされます。私は長い間C / C ++コードを記述しており、基盤となる設計を十分に認識しています。また、次のコードが簡単な回避策であることも知っています。
私が理解していないのは、ロックを保持している間にオブジェクトが明示的に破棄されたときに、.NETミューテックスがリリースを強制しない理由です。それは、他の.NETプログラミングパラダイムとより一致しているのではないでしょうか。開発者がロックされたミューテックスを明示的に破棄した場合...それを放棄としてマークすることだけが意味があります。
c# - 放棄されたミューテックス例外
初めてミューテックスを使用しようとしていますが、プログラムの2つの別々のインスタンスで次のコードを実行しています
これを実行すると、インスタンスの1つ(最初に実行したもの)が出力されます
他のインスタンスは印刷します
そして、最初のインスタンスがミューテックスをリースするとすぐに、例外を除いて2番目の待機ステートメントでクラッシュします。
なぜこの例外が発生するのか、どうすればそれを防ぐことができるのかについてのアイデアはありますか?
解決策:おそらくmdsnのドキュメントをもっと明確に読むべきでした。私を正しい方向に向けてくれてありがとうアンドリュー
WaitHandle.WaitOneメソッドを使用して、ミューテックスの所有権を要求できます。ミューテックスを所有するスレッドは、その実行をブロックすることなく、WaitOneへの繰り返しの呼び出しで同じミューテックスを要求できます。ただし、ミューテックスの所有権を解放するには、スレッドはReleaseMutexメソッドを同じ回数呼び出す必要があります。ミューテックスクラスはスレッドIDを強制するため、ミューテックスはそれを取得したスレッドによってのみ解放できます。
c# - AbandonedMutexExceptionから優雅に抜け出す方法は?
次のコードを使用して、実行中の複数のプロセス間で共有リソースへの相互に排他的なアクセスを同期します。
ミューテックスは次のように作成されます。
次に、このメソッドを使用して、相互に排他的なセクションに入ります。
そしてそれを残すためのこのコード:
AbandonedMutexException
しかし、実行中のプロセスの1つがクラッシュした場合、またはタスクマネージャーから終了した場合、ミューテックスは例外を返す可能性があります。だから私の質問は、それから抜け出すための優雅な方法は何ですか?
これはうまくいくようです:
しかし、その場合、相互に排他的なセクションに入ることができますか?
誰かが明確にすることができますか?