2008-09-05 3 views
9

私は、プログラムの複数のインスタンスを一度に実行できる状況があります。特定の機能のうち1つだけがこれらのインスタンスの複数で同時に実行されないことが重要です。これはmutexの適切な使用ですか?

ミューテックスを使用してこれを防止する適切な方法ですか?

lock (this.GetType()) { 
    _log.Info("Doing Sync"); 
    DoSync(); 
    _log.Info("Sync Completed"); 
} 

答えて

18

1つのアプリケーションの複数のインスタンスがありますので、2つのprogram.exeが実行されているとしますか?ロックステートメントは、プログラム内の複数のプログラムにロックされません。真のミューテックスが必要な場合は、System.Threading.Mutexオブジェクトを見てください。ここで

は使用例です:

bool createdNew; 
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew)) 
{ 
    try 
    { 
     mtx.WaitOne(); 

     MessageBox.Show("Click OK to release the mutex."); 
    } 
    finally 
    { 
     mtx.ReleaseMutex(); 
    } 
} 

createdNew変数は、あなたがそれを初めて作成されたかどうかをお知らせします。しかし、それが作成されているかどうかだけを伝えます。ロックを取得したい場合は、WaitOneに電話してからReleaseMutexを呼び出して解放する必要があります。ミューテックスを作成したかどうかだけを見たい場合は、それを構築するだけです。

5

シーカーが正しいです。

ロックでのClr Via C#(p638-9)のJeff Richterの助言は、ロックされる目的で専用のオブジェクトを作成することです。

private Object _lock = new Object(); 

// usage 
lock(_lock) 
{ 
    // thread-safe code here.. 
} 

これは、_lockを現在のクラス以外のものでロックすることができないために機能します。

EDIT:これは、1つのプロセス内で実行されるスレッドに適用されます。 @David Mohundroの答えは、プロセス間のロックに対して正しいです。

関連する問題