質問
プログラムの複数のインスタンスを同時に実行する状況がありますが、これらのインスタンスのうちの複数のインスタンスで 1 つの特定の関数だけが同時に実行されないようにすることが重要です。
これを防ぐためにミューテックスを使用するのは正しい方法ですか?
lock (this.GetType()) {
_log.Info("Doing Sync");
DoSync();
_log.Info("Sync Completed");
}
解決
1 つのアプリケーションの複数のインスタンスとおっしゃったので、2 つの Program.exe が実行されているということですよね?lock ステートメントは複数のプログラムにわたってロックするのではなく、プログラム内でのみロックします。真の Mutex が必要な場合は、 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 を呼び出してロックを解放する必要があります。Mutex を作成したかどうかだけを確認したい場合は、それを構築するだけで問題ありません。
他のヒント
シーカーは正しいです。
ジェフ・リヒターのアドバイス C#経由でClr (p638-9) ロックについては、特にロックされることを目的としたプライベート オブジェクトを作成することです。
private Object _lock = new Object();
// usage
lock( _lock )
{
// thread-safe code here..
}
_lock は現在のクラスの外部のものによってロックできないため、これが機能します。
編集:これは、単一プロセス内で実行されるスレッドに適用されます。@David Mohundroの答えは、プロセス間ロックに関しては正しいです。
所属していません StackOverflow