2017-08-23 5 views
-1

私はC#アプリケーションでマルチスレッドについて何かを理解しようとしています。私はSecurityComponentBaseと呼ばれる基本クラスで次のコードを持つアプリケーションを継承:いつC#ベースクラスで辞書をロックする必要があるのですか?

 m_permissionsLock.EnterWriteLock(); 
     try 
     { 
      if (m_grantedPermissions.Count > 0) 
      { 
       m_grantedPermissions.Clear(); 
       m_loggingComponent.WriteSecurityLog(
        "Security permissions cleared for user: " + CurrentLoggedUser.Username); 
      } 

      foreach (var p in permisions) 
      { 
       m_loggingComponent.WriteSecurityLog("Security permission: "+ p.PermissionName + " Granted to user: " + userName); 
       m_grantedPermissions.Add(p.PermissionName, p); 
      } 

     } 
     finally 
     { 
      m_permissionsLock.ExitWriteLock(); 
     } 

m_permissionsLockを次のように定義される。

private readonly Dictionary<string, Permission> m_grantedPermissions = new Dictionary<string, Permission>(); 

:m_grantedPermissionsのように定義される

private readonly ReaderWriterLockSlim m_permissionsLock = new ReaderWriterLockSlim(); 

開発者は彼がを持っていることを知っていますか?私にとっては、他のスレッドがどこから来るのか分からない。私はこのマルチスレッドのことを初めて覚えていることを覚えておいてください。しかし、私はこれをやらなければならないことをどのように知っていますか?

+0

プライベートメンバー変数です。あなたのクラスだけがアクセスできます(あなたが他の公共のプロパティやメソッドを介して渡している場合を除きます)。したがって、あなたはそれがどのようにアクセスされているか知っています。クラスをスレッドセーフにするには、辞書を使用するすべてのメソッドが適切にロックされている必要があります。 – lesscode

答えて

3

開発者は、この辞書をロックでラップする必要があることはいつ知っていますか?

私たちは、以下の原則を守ってください。はどのような方法で、辞書、あるいはその内容を変更するとき

  1. 書き込みロックを取得します。 辞書やその内容にアクセスするとき

  2. はどちらか修正することなく、読むロックを取得します。辞書に

  3. コントロールアクセス、これだけ我々はこのクラスでは、それをアクセスすることができます。辞書にアクセスする必要があります。

貼り付けたコードにポイント1が示されています。ポイント番号3はprivate宣言がm_grantedPermissionsのコードでも実演されています。このクラスのコードだけがプライベートメンバーにアクセスできます。

私には、他のスレッドがどこから来るのかわかりません。

ここで、呼び出しスレッドは関係しません。スレッドがこのクラスのコードを実行すると、開発者はディクショナリを読み書きする場所を特定し、それに従って各参照をラップすることができます。このクラスにアクセスできるのはです。ソリューション全体を検索する必要はありません。ただ一つのクラス。

Visual Studioでは、m_grantedPermissionsをダブルクリックするとすべてのインスタンスが強調表示されます。 「m_grantedPermissions」を検索して、すべての参照を検索することもできます。

m_grantedPermissionsへの各参照は、適切なロックで包む必要があります。

+0

私はこれが私的であるため、辞書にアクセスする唯一のクラスだと理解します。だから、なぜそれを使用している唯一のクラスでこれをロックで保護する必要がありますか? – Ray

+0

このクラスメソッドは異なるスレッドで同時に呼び出すことができるため、あなたが適切にロッキングしないで同時に読み書きすると、あなたは悪い時を過すでしょう。このクラスがパブリックメソッド 'A()'、 'B()'などを持っていて、それぞれ何らかの方法で辞書にアクセスしたとしましょう。 ** IF **同時に呼び出すことは可能ですが、同時に読み書きを試みないようにするには、ロック機構を実装する必要があります。 – Amy

+0

これは、公開されている辞書と対照的です。プログラマが使いたいときは、同じロック機構を使ってロックする必要があります(誰もが同じメカニズムを使って動作させる必要があります)。それは非常に素早く非常に毛深くなり、**安全な同時アクセス**を確保することは非常に困難です。それがあなたを非公開にする唯一の理由です。 – Amy

関連する問題