2017-01-17 11 views
0

私はこのようなミューテックスを使用しているアプリケーション(私はこれを書いていない)があります。C#のミューテックスクラスを使用してのこの代替方法のいずれかの損失がありますか?

static void Main(string[] args) 
{ 
    Mutex mutex = null; 

    try 
    { 
     mutex = Mutex.OpenExisting("SINGLEINSTANCE"); 

     if (mutex != null) 
     { 
      return; 
     } 
    } 
    catch (WaitHandleCannotBeOpenedException ex) 
    { 
     mutex = new Mutex(true, "SINGLEINSTANCE"); 
    } 

    // critical section here 
} 

をしかし、私は正しい方法でこのことを知っている:これが原因でのみ使用され

private readonly Mutex m = new Mutex("SINGLEINSTANCE"); 
static void Main(string[] args) { 
    m.WaitOne(); 
    try { 
     /* critical code */ 
    } 
    finally { 
     m.ReleaseMutex(); 
    } 
} 

このアプリケーションの1つのプロセスを同時に実行できます。これは、Webアプリケーション用の非同期ジョブを実行するコンソールアプリケーションです。

このコードは生産されて、私はこのコードのいくつかの大きな問題がない限り、それを変更したくない...ありますか?

+2

生産中で壊れていない場合は、なぜそれを変更または修正したいのですか? – CodingYoshi

+4

あなたの「正しい方法」は、異なる動作をします。ミューテックスが存在する場合、古い方法は、ミューテックスが自由であるためには、あなたの新しい道はただ待って、プログラムを終了します。しかし、古い方法はまだ競争状態を持っています。また、ミューテックスのコンストラクタは 'PARAMTERとしてbool'取り、その上の真または偽の値が大幅にあなたのコードは、このユースケースのために働くだろう方法に影響を与えBOOL。 –

答えて

2

古いコードでは、2つのプロセスが同時に開始しようとする競合状態があります.2番目のプロセスは例外をスローし、new Mutex(true, "SINGLEINSTANCE");行でクラッシュします。ミューテックスがすでに存在している場合、あなたはプログラムが正常終了し、クリティカルセクションを実行することはありません競合状態を持っていません。

有効なコンストラクタをMutexに使用しなかったため、新しいコードをコンパイルできませんでしたが、falseを渡した場合、コードは以前のミューテックスがリリースされるのを待ってから、クリティカルセクション、早期にプログラムを終了することはありません。

「正しい」方法は、2つの方法を組み合わせて、ミューテックスを作成して作成し、outパラメータで過負荷を使用しているかどうかを確認することです。

static void Main(string[] args) 
{ 
    bool taken; 
    using(Mutex mutex = new Mutex(true, "SINGLEINSTANCE", out taken)) 
    { 
     if(!taken) 
      return; 
     try 
     { 
      // critical section here 
     } 
     finally 
     { 
      mutex.ReleaseMutex(); 
     } 
    } 
} 
関連する問題