2011-07-25 6 views
2

辞書として保持するクラスを記述する必要があります。ディクショナリには複数のスレッドがアクセスします。 各アクセスは非常に短くなります。ロック戦略に関する質問(C#/ .NET 3.5 SP1)

私は期待して:

  • 毎分2秒毎のエントリ
  • を追加または削除アクセス。私はそのディクテーションのコピーを作成する必要があります。それをチェックして(例えば、DBに電話するなど)
  • 1秒に何回も値のフィールドをキーの1つに更新しました。 (値は構造体です)同じキーは同時にアクセスされません。

どのロック戦略を選択するのですか?その理由は何ですか? 私の最初のショットはReaderWriterLockSlimを使用することです。しかし、私が読んだ後では、それはモニターよりも2倍遅いです、私は、私がdictにアクセスするたびに、私は非常に短くロックするつもりであるので、もはやそれほど確実ではありません。

TIA マーティン

+2

.NET 4.0にはスレッドセーフなConcurrentDictionaryクラスがあります。 – Bas

答えて

3

最も頻繁に操作がを書いであり、あなたは私の知る限り、複数の同時読者を必要としないことを考えると、私は通常のロックを使用します。私はReaderWriterLockSlimがあなたを助けてくれるのを見ることができません。そして、それは確かにあなたにもっと複雑なコードを与えるでしょう。

EDIT:1つの可能な最適化は、書き込みスレッドからの変更リストにアクセスすることです。読み取りスレッドは、そのリストをロックする必要がありますちょうどそれは処理する前に基本となる辞書を更新します。辞書が非常に大きいものの、変更のリストが比較的小さいと仮定すると、書込みスレッドがより短時間でブロックされることを意味します。

実際、リストの代わりにQueueのようなものを使用すると、読み込みスレッドを小さなバッチとデキューからデキューし、書き込みスレッドの待ち時間をさらに短縮することができます。スレッドを読み込むとそのうち10個が読み込まれ、キューに追加するのを待っている書き込みスレッドがターンを得ることができるようになります。

パフォーマンスの重要性、特にレイテンシの観点から、これまでより複雑な解決策がありますが、私は辞書のロックを外して始めます。

+0

しかし、彼は2秒ごとに辞書からコピー(=読み込み)する必要があることを考えると、単純なロックではオーバーヘッドが大きくなりませんか? – sternr

+2

@sternr:なぜですか?ロッキング自体は安いです - それは遅くなるコピーです、あなたはそれを避けることはできません。あなたが使用しているロック方法をコピーしている間は、あなたは書き込みを行うことができません。 –

+0

@sternr:AFAIK 'lock'は' ReaderWriterLockSlim'より速い –

関連する問題