オブジェクトの作成中にミューテックスを使用して一部のコードを同期するアプリケーションコードがあります。オブジェクトコンストラクタはミューテックスを取得し、オブジェクトが不要になったときにのみリリースします。したがって、ミューテックスをリリースする場所はオブジェクトデストラクタに1つあります。アプリの2つのインスタンスを使用してコードをデバッグすると、最初のインスタンスが最初にミューテックスを取得し、2番目のインスタンスが座って待機します(mut.WaitOne())。次に、ユーザーは最初のアプリインスタンスを閉じます。この場合、2番目のインスタンスmut.WaitOne()は、「ミューテックスが放棄されたために待機が完了しました」という例外をスローします。これは、最初のインスタンスでmut.ReleaseMutex()が呼び出される前に発生します(MutexReleaseを呼び出す前にオブジェクトデストラクタコードのブレークポイントにヒットしたためです)。ReleaseMutex()が呼び出される前にミューテックスが解放されたため、例外が発生したようです。この競合状態をどのように解決しますか?ご協力ありがとうございました。
public sealed class MyObject
{
static ExtDeviceDriver devDrv;
private Mutex mut = new Mutex(false,myMutex);
public MyObject()
{
mut.WaitOne();
//Thread safe code here.
devDrv = new ExtDeviceDriver();
}
~MyObject()
{
mut.ReleaseMutex();
}
}