2

私はここで完全に困惑しています。ミューテックスに依存して保護するコードのチャンクがあります。このコードのチャンクを開発マシンとテスト マシンで実行すると、問題なく動作します。しかし、それを本番マシンにプッシュすると失敗します。

しかし、これがキッカーです。以前は機能していましたが、この特定のブロックにコードを変更しませんでした。しかし、もっと待ってください!文字通りまったく同じコード ブロックを使用する 2 番目のプロセスがあり、問題なく動作します。

ミューテックスは次のように宣言されます。

Mutex _mutex = new Mutex(false, "SendTextMessage_11A52B63-4FC6-46DF-B72C-C45B225D4143"); 

それを使用するコードのブロックは次のとおりです。

        public override void ForwardTextMessagesToDevice()
    {
        Trace.WriteLine("Here1");
        if (!_mutex.WaitOne(30000))
        {
            Trace.WriteLine("Here2");
            Trace.WriteLine(String.Format("return mutex ForwardTextMessage: {0} {1}", this.Name, DateTime.Now));
            return; 
        }
        try
        {
            Trace.WriteLine("Here3");
            ScheduledReports();
        }
        finally
        {
            Trace.WriteLine("Here4");
            _mutex.ReleaseMutex();
        }

トレース出力は次のとおりです。

Here1
Here2
return mutex ForwardTextMessage: Method 2/11/2013 3:59:06 PM
Here1
Here2
return mutex ForwardTextMessage: Method 2/11/2013 4:00:06 PM

ミューテックスは、ゲートから出た直後にロックされているようです。ミューテックスはスレッド間でのみ共有され、プロセスが終了すると破棄されるので、同じミューテックスを共有する 2 つの別個のプロセスは適切であるという印象を受けています。また、ミューテックスが解放される前にアプリケーションがクラッシュした場合、この動作が発生する可能性はありますか?

編集:私はほとんど忘れていました。ランダムに以前に、アプリケーションが激しくクラッシュし、強制終了する必要がありました。

4

1 に答える 1

2

ミューテックスは、ゲートから出た直後にロックされているようです。ミューテックスはスレッド間でのみ共有され、プロセスが終了すると破棄されるという印象を受けているので、同じミューテックスを共有する2つの別々のプロセスは良いはずですよね?

いいえ 。名前付きMutex インスタンスはすべてのプロセス間で共有されます。別のプロセスがミューテックスをロックしている可能性があります。

使用している Mutex コンストラクターのドキュメントから:

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

2番目の質問について:

また、ミューテックスが解放される前にアプリケーションがクラッシュした場合、この動作が発生する可能性はありますか?

これはMutexのドキュメントでカバーされています:

ミューテックスを所有しているときにスレッドが終了した場合、そのミューテックスは放棄されたと言われます。ミューテックスの状態はシグナル状態に設定され、次の待機中のスレッドが所有権を取得します。誰もミューテックスを所有していない場合、ミューテックスの状態が通知されます。.NET Framework のバージョン 2.0 以降では、ミューテックスを取得する次のスレッドで AbandonedMutexException がスローされます。.NET Framework のバージョン 2.0 より前では、例外はスローされませんでした。

アプリケーションが終了するシナリオでは、ミューテックスに放棄フラグを立てる必要があります。を取得しようとすると、Mutexが発生しAbandonedMutexExceptionます。

于 2013-02-12T00:15:46.817 に答える