0

SO やその他のサイトでキャッシュとスレッドの同期についてかなり読んだことがありますが、まだ質問に対する答えが得られません。

静的ディクショナリ キャッシュの .NET スレッド セーフ

ロックは正確にどのように機能しますか?

ロックが別々のオブジェクトに対して実行されるのはなぜですか?

http://msdn.microsoft.com/en-us/magazine/cc188793.aspx

...

外部からのみ読み取られるリソースを公開するキャッシュを実装しようとしています。これらのリソースは更新できますが、頻繁に更新されるわけではなく、それほど時間もかかりません。

基本的に、リソースはキー値 (id と文字列) のリストであり、それほど大きくはありません (要素数は 100 を超えません)。

そのため、ほとんどの場合は必要ないため、同期のオーバーヘッドを回避するために読み取りメソッドにロックをかけたくありませんが、リソースを更新する必要があるときに使用したいと思います。

私の質問は次のとおりです。次のようなことを行う方法はありますか:

public class AFTypeCache<T> where T : class
{
   private Dictionary<int, T> _types;
   private Func<Dictionary<int, T>> _dataProvider;
   private readonly object _sync = new object();

   public void UpdateData()
   {
       // here something (?) to make sure no more threads are reading the resource
       lock (_sync)
       {
           _types = _dataProvider();
       }
   }

   public IEnumerable<int, T> Get()
   {
       // thought about something like that but I'm pretty sure this won't work...
       if (_updating)
       {
           lock
           {
                return _types;
           }
       }
       else
       {
           // I know not the way to get enumerator but that's not the point
           return _types;
       }
   }
}

また、これを達成しようとするのは本当に便利ですか、それとも間違った方法でGetメソッドでロックを使用する必要がありますか?

編集:

さらにGoogle検索を行った後、より正確な質問があります. クラス参照が他のスレッドで使用されているかどうかを知ることは可能ですか?

4

1 に答える 1

0

何か不足していますか、それとも並行辞書を作成しようとしていますか? もしそうなら、なぜフレームワークのものを使わないのですか? ( http://msdn.microsoft.com/en-us/library/dd287191.aspx )

並行辞書 (または独自のバージョン) で問題を解決できます。スレッド ID とクラス名をキーとして使用し、値はスレッドでのクラスの使用法を示すブール値です。 .

しかし、これを行う理由もわかりません。並行辞書はフレームワークに既に存在します。

于 2013-03-29T10:30:43.247 に答える