2

このオブジェクトは (サード パーティの DLL を介して) 外部ハードウェア デバイス オブジェクトを作成し、ハードウェア デバイス オブジェクトは 1 回しか作成できないため、ロックする必要があるオブジェクトを作成するアプリがあります。このアプリの複数のインスタンスが起動された場合、最初のインスタンスのみがこの C# オブジェクトを作成できる必要があります。サブシーケンス インスタンスは、オブジェクトがロックされており、オブジェクトを作成できないことを確認する必要があります。このオブジェクトの作成は複数のアプリ インスタンス (複数のプロセス) で行われるため、ミューテックスを使用しました。ただし、コードはミューテックスでロックされません。それぞれが独自のロックを作成する複数のインスタンスを実行していますか?

public sealed class MyObject
{
    private static MyObject _myObject;
    static ExtDeviceDriver devDrv;
    private readonly static Mutex mut = new Mutex();

    private MyObject()
    {
        mut.WaitOne();
        //Thread safe code here.
        devDrv = new ExtDeviceDriver();
    }

    ~MyObject()
    {
        mut.ReleaseMutex();
    }

    // object accessor
    public static MyObject GetMyObject
    {
        get
        {
            if (_myObject == null)
                _myObject = new MyObject();
            return _myObject;   
        }
    }
}
4

1 に答える 1

2

名前付きミューテックスを使用する必要があると思います ( MSDN のこの記事を参照してください)。

ミューテックスには、ローカル ミューテックスと名前付きシステム ミューテックスの 2 種類があります。名前を受け入れるコンストラクターを使用して Mutex オブジェクトを作成すると、その名前のオペレーティング システム オブジェクトに関連付けられます。名前付きシステム ミューテックスは、オペレーティング システム全体で表示され、プロセスのアクティビティを同期するために使用できます。同じ名前付きシステム ミューテックスを表す複数の Mutex オブジェクトを作成でき、OpenExisting メソッドを使用して既存の名前付きシステム ミューテックスを開くことができます。

したがって、このコンストラクターを使用して、名前付きミューテックスを作成してみてください。さらに、 Mutex.OpenExisting Methodで既に存在するかどうかを確認する必要があります(この記事に記載されている例を検討してください。名前付きミューテックスを確認、作成、利用する方法を説明しています)。

編集

Mutex クラスを参照してください。

WaitHandle.WaitOne メソッドを使用して、mutex の所有権を要求できます。ミューテックスを所有するスレッドは、その実行をブロックすることなく、WaitOne への繰り返しの呼び出しで同じミューテックスを要求できます。ただし、スレッドは、ミューテックスの所有権を解放するために、ReleaseMutex メソッドを同じ回数呼び出す必要があります。Mutex クラスはスレッド ID を強制するため、mutex はそれを取得したスレッドによってのみ解放されます。

そしてMutex Constructor (Boolean, String)、つまり、bool 引数を次のように設定する必要があります。

この呼び出しの結果として名前付きシステム ミューテックスが作成された場合に、呼び出し元スレッドに名前付きシステム ミューテックスの初期所有権を与える場合は true 。それ以外の場合は false。

于 2012-09-18T01:07:35.050 に答える