8

これはやり過ぎで、これらのうちの 1 つだけが必要ではないでしょうか? ここここで C# の相互排除とロックに関するさまざまな投稿を検索して見つけました。

例:
このアプリには、複数の再接続スレッドをスピンオフする関数があり、このスレッド内で aMutexと aを使用しlockます。コードのこのセクションへのアクセスをブロックし、他のスレッドによる更新lockを妨げませんか?connect

bool connect = false;
Mutex reconnectMutex = new Mutex(false, "Reconnect_" + key);

try
{
   lock(site)
   {
      if(site.ContainsKey(key))
      {
         siteInfo = (SiteInfo)site[key];
         if(reconnectMutex.WaitOne(100, true))
         {
            connect = true;
         }
      }
   }

   if (connect)
   { 
      // Process thread logic
   }
}
catch
{}

reconnectMutex.ReleaseMutex();

詳細:
これは、Web ガーデンで実行されていない ASP.NET WebService にあります。

4

4 に答える 4

11

その Mutex (名前があるため) は、同じマシン上でそれにアクセスしているすべてのプロセスを停止しますが、lock は同じプロセス内の他のスレッドのみを停止します。そのコード サンプルからは、なぜ両方の種類のロックが必要なのかわかりません。単純なロックを短期間保持することは良い習慣のように思えますが、その後、より重いプロセス間ミューテックスがおそらくより長い期間 (重複しますが) ロックされます! ミューテックスを使用する方が簡単です。そしておそらく、プロセス間ロックが本当に必要かどうかを調べるためです。

ちなみに、catch {}そのシナリオで使用するのは絶対に間違っています。を使用する必要がありますfinally { /* release mutex */ }。それらは非常に異なります。catch は、本来よりもはるかに多くの種類の例外を飲み込みます。また、メモリ破損、アクセス違反などの低レベルの例外に応答して、ネストされた finally ハンドラーを実行させます。

try
{
    // something
}
catch
{}

// cleanup

あなたが持っている必要があります:

try
{
    // something
}
finally
{
    // cleanup
}

また、回復できる特定の例外がある場合は、それらをキャッチできます。

try
{
    // something
}
catch (DatabaseConfigurationError x)
{
    // tell the user to configure the database properly
}
finally
{
    // cleanup
}
于 2009-03-13T15:17:05.797 に答える
3

「ロック」は基本的に、Montor.Enter/Exit のシンタックス シュガーです。Mutex はマルチプロセス ロックです。

それらは非常に異なる動作をします。これらは異なるものをブロックするように設計されているため、同じアプリケーションまたはメソッドで両方を使用しても問題はありません。

ただし、あなたの場合、セマフォとモニターを調べたほうがよいと思います。プロセス間でロックする必要があるようには思えないため、この状況ではおそらくプロセスを選択する方が適切です。

于 2009-03-13T15:21:14.803 に答える
2

他の人が指摘したように、Mutex はプロセス間でロックし、ローカル ロック (モニター) は現在のプロセスが所有するスレッドのみをロックします。でも ...

あなたが示したコードにはかなり深刻なバグがあります。最後に無条件に Mutex を解放しているように見えますが (つまりreconnectMutex.ReleaseMutex())、Mutex は return の場合にのみ取得されsite.ContainsKey()ますtrue

したがって、site.ContainsKeyが返された場合、呼び出し元のスレッドが Mutex を所有していないため、falseMutex を解放するとスローされます。ApplicationException

于 2009-03-13T19:12:45.277 に答える
1

本当にこれに答えるのに十分な情報を提供しませんでした。Earwicker が既に述べたように、Mutex を使用すると、プロセス間で同期を行うことができます。したがって、実行中の同じアプリのインスタンスが 2 つある場合は、アクセスをシリアル化できます。たとえば、外部リソースを使用するときにこれを行うことがあります。

サイトをロックすると、同じプロセス内の他のスレッドによるアクセスからサイトが保護されます。他のメソッド/スレッドが何をしているかによっては、これが必要になる場合があります。これがそのサイトがロックされている唯一の場所である場合、はい、それはやり過ぎだと思います.

于 2009-03-13T15:22:55.750 に答える