2012-02-15 26 views
0

だから私はDictionary<string, SomeClass>を持っているので、複数の並行スレッドによって頻繁にアクセスされます。ロックなし、同期なし - ワーカースレッドはチェックを行わず、単に読み書きしか行いません。唯一の保証は、2つのスレッドが同じキーで値を書き込むことはないということです。問題は、このデータ構造がこのように壊れてしまうことですか?破損していると、私は1つのスレッドでももう動作しません。Dictionary(Of TKey、TValue)同時アクセス:最悪のシナリオ

+1

あなたは*ないとはどういう意味ですかもう何もしない*? – Yuck

+0

@Yuck通常の操作やそのような操作を実行している間に、奇妙な例外を投げています。 Msdnは「スレッドセーフではない」としか言いません。それは腐敗の可能性を意味するのか、それとも非原子性の可能性を意味するのでしょうか? – ren

+1

"thread-safeではない"とは、詳細を必要とせず、考えられるすべてのエラーをリストするのは通常非常に難しいでしょう。そして本当に厄介なものは一年に一度しか起こらない。あなたがそれらを見つけて/ reproする必要があるときニース。 –

答えて

5

最悪のシナリオは、次のとおりです。

  • とNullReferenceExceptionまたは辞書<、>メソッドの外に投げIndexOutOfRangeExceptionを。

  • 任意の量のデータが失われます。 2つのスレッドがディクショナリ<、>テーブルを同時にサイズ変更しようとすると、互いをぶつかり合ってしまい、データが失われる可能性があります。

  • 誤った答えが<の辞書から読み取られます。基本的には

、辞書<は、> CLRによって課される制限内で、ちょうどあなたが考えることができる悪い何でも行うことができます。おそらく、ネイティブプログラミング言語のように、型の安全性を破ったり、ヒープを破損したりすることはありません。あなたが複数のスレッドからコレクションにアクセスしている場合はおそらく、とにかく

7

このデータ構造がこのように壊れてしまう可能性がありますか?

はい、ほとんどの場合、IndexOutOfRangeまたは同様の例外が発生します。
例外をキャッチして無視しても、信頼できるデータはもう得られません。重複と欠損値の両方が可能です。

このようにしないでください。

+0

+1。具体的には、ドキュメント(http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)から: "コレクション(TKey、TValue)は、コレクションが変更されない限り、複数のリーダーを同時にサポートできますまったくそうではありませんが、コレクションを列挙することは、本質的にスレッドセーフな手順ではありません。まれに、列挙が書き込みアクセスと競合する場合、列挙全体でコレクションをロックする必要があります。読み書きするには、独自の同期を実装する必要があります。 –

2

:-)、それは、.NET 4でのスレッドセーフな品種のいずれかを使用するのが最も安全だろう、などConcurrentDictionary

関連する問題