だから私はDictionary<string, SomeClass>
を持っているので、複数の並行スレッドによって頻繁にアクセスされます。ロックなし、同期なし - ワーカースレッドはチェックを行わず、単に読み書きしか行いません。唯一の保証は、2つのスレッドが同じキーで値を書き込むことはないということです。問題は、このデータ構造がこのように壊れてしまうことですか?破損していると、私は1つのスレッドでももう動作しません。Dictionary(Of TKey、TValue)同時アクセス:最悪のシナリオ
答えて
最悪のシナリオは、次のとおりです。
とNullReferenceExceptionまたは辞書<、>メソッドの外に投げIndexOutOfRangeExceptionを。
任意の量のデータが失われます。 2つのスレッドがディクショナリ<、>テーブルを同時にサイズ変更しようとすると、互いをぶつかり合ってしまい、データが失われる可能性があります。
誤った答えが<の辞書から読み取られます。基本的には
、辞書<は、> CLRによって課される制限内で、ちょうどあなたが考えることができる悪い何でも行うことができます。おそらく、ネイティブプログラミング言語のように、型の安全性を破ったり、ヒープを破損したりすることはありません。あなたが複数のスレッドからコレクションにアクセスしている場合はおそらく、とにかく
このデータ構造がこのように壊れてしまう可能性がありますか?
はい、ほとんどの場合、IndexOutOfRangeまたは同様の例外が発生します。
例外をキャッチして無視しても、信頼できるデータはもう得られません。重複と欠損値の両方が可能です。
このようにしないでください。
+1。具体的には、ドキュメント(http://msdn.microsoft.com/en-us/library/xfhwa508.aspx)から: "コレクション(TKey、TValue)は、コレクションが変更されない限り、複数のリーダーを同時にサポートできますまったくそうではありませんが、コレクションを列挙することは、本質的にスレッドセーフな手順ではありません。まれに、列挙が書き込みアクセスと競合する場合、列挙全体でコレクションをロックする必要があります。読み書きするには、独自の同期を実装する必要があります。 –
:-)、それは、.NET 4でのスレッドセーフな品種のいずれかを使用するのが最も安全だろう、などConcurrentDictionary
- 1. Enumer Dictionary <TKey、TValue>とEnumerable.Unionメソッド
- 2. Dictionary <TKey、TValue>でのハッシュ処理の仕組み
- 3. DataContractJsonSerializerでJSONにDictionary <TKey、TValue>をシリアライズ
- 4. 辞書<TKey、TValue> .ItemプロパティのC#
- 5. IDictionaryではなくDictionary <TKey、TValue>でアクセスできるプロパティとメソッドは何ですか?
- 6. Cの辞書のConcat TkeyとTValue
- 7. 入れ子のインターフェイス:IDictionary <TKey、IEnumerable <TValue>>にIDictionary <TKey、IList <TValue>>をキャストしますか?
- 8. 拡張メソッド辞書<TKey,TValue> .RemoveAll?出来ますか?
- 9. (TKey、TValueの)Inherits Dictionaryは大文字と小文字を区別することはできません
- 10. Dictionary of IQueryable辞書
- 11. 構文<(うち<(< "TKEY、TValue>)>)> .. :: ..列挙子
- 12. Confluent.Kafka.Producer <TKey、TValue> .ProduceAsyncはスレッドセーフですか?
- 13. Collections.Generic.Dictionary <TKey,Tvalue> Viewmodelからコントローラへのモデルバインド
- 14. ディクショナリでキーによるディクショナリ<TKey、TValue>の順序はありますか?
- 15. IReadOnlyDictionary <TKey、TValue>がSortedDictionary <TKey、TValue>から割り当てることができないのはなぜですか?
- 16. TDictionary <TKey,TValue>の逆のキーリストを作成する簡単な方法は?
- 17. 辞書(TKey、TValue)GetHashCodeとEquals - どのように動作しますか?
- 18. 項目を追加中にConcurrentDictionary <TKey、TValue>にToList()を呼び出す
- 19. C#SortedList <TKey、TValue> .Keys.Null例外をスローするメソッドが良いですか?
- 20. TKeyとTValueは汎用辞書に含まれていますか?
- 21. IDictionary <TKey、TValue>をIEnumerable <object>にアップキャスティングするのが失敗するのはなぜですか?
- 22. コンテキストスイッチ:最悪のシナリオではどうなりますか?
- 23. シェルソートの最悪シナリオ:Θ(N^3/2)またはO((NlogN)^ 2)?
- 24. Out of MemoryシナリオでのAndroidのテスト
- 25. スプレイツリー最悪検索時間
- 26. アルゴリズムの実行時間、最も遅い最悪の場合最悪の場合
- 27. OrderedDictionaryとDictionary
- 28. DataBinding/WPFの一般的なObservable DictionaryクラスC#
- 29. DictionaryBaseとDictionaryの違い
- 30. 辞書<TKey,TValue>:テレビの正確なタイプは、あなたが入れたものによって決まります
あなたは*ないとはどういう意味ですかもう何もしない*? – Yuck
@Yuck通常の操作やそのような操作を実行している間に、奇妙な例外を投げています。 Msdnは「スレッドセーフではない」としか言いません。それは腐敗の可能性を意味するのか、それとも非原子性の可能性を意味するのでしょうか? – ren
"thread-safeではない"とは、詳細を必要とせず、考えられるすべてのエラーをリストするのは通常非常に難しいでしょう。そして本当に厄介なものは一年に一度しか起こらない。あなたがそれらを見つけて/ reproする必要があるときニース。 –