要素の追加、読み込み、削除に関してC#ディクショナリはスレッドセーフではないことを理解しています。ただし、別のスレッドが辞書に書き込み、読み取り、および削除している場合、C#ディクショナリのCountプロパティにスレッドセーフな方法でアクセスできますか?C#ディクショナリへのマルチスレッドアクセス
答えて
辞書を静的な読み取り専用オブジェクトとして作成し、それを変更するときにはlock
...ほとんどの問題に対処する必要があります。
プロパティはボンネットのフードの下のメソッドコールなので、実際の状況は一見したほど単純ではありません。
- T1:アクセスCountプロパティ
- T1:get_Count()呼び出し(JMP/GOTO ASM命令のいくつかの種類)
- T1:アイテムの数を表す変数を読み取る== 1つの
- T2 :新しいアイテムをaddign、実際のカウントは2
- T1となります。アプリケーション・ロジックがに依存しているのであれば1を返しますが、実際には2つの項目
が既に存在しています理論上はrace conditionで終わる可能性があります。
スレッドセーフでなければなりませんが、それはスレッドセーフではないということは、他のスレッドが辞書を操作しているために正確なカウントが得られない可能性があるということです。
[編集:usrが指摘しているように、現在このレベルでスレッドセーフであるという理由だけで、それはそのままであるとは限りません。あなたは保証がありません]
あなたが達成したいことに応じて、ReaderWriterLockSlimで辞書を保護することができます。このようにして、突然変異操作を実行するときに読み込みを高速化し、辞書をロックすることができます。
よりもむしろ仮定し、私が行って、反射鏡でそれを見て:
public int Count
{
get
{
// count and freeCount are local fields
return (this.count - this.freeCount);
}
}
そうです、それはそれは辞書オブジェクトで破損が発生することはありませんアクセスする際に、「スレッドセーフ」です。つまり、ある辞書が別のスレッドによってアクセスされている場合は、何らかの精度でカウントを取得することが重要なユースケースを考えることができるとは思えません。
'if(dict.Count == 1)'決して*安全に*働かない –
@ L。Bあなたは私の答えの最後にパラグラフを読んだのですか? –
私は答えを全部読まずにコメントを書いていると思いますか? 「辞書が別のスレッドによってアクセスされている場合、何らかの正確さでカウントを取得することが重要なユースケースについて考えることができます」あなたの想像力では正解だが限定されている。 –
まず、これは危険な考えです。あなたがそのようなものを生産に入れるなら、非常に注意してください。おそらく、ロックまたはConcurrentDictionaryを使用するだけです。
おおよその回答で快適ですか?
しかし、:リフレクターは、カウントがちょうどいくつかのフィールドを読み取り、それを返すことを示しています。これは永遠に変わらない可能性が高いです。そうすれば、この場合リスクを冒すことができます。
- 1. SimpleDateFormatへのマルチスレッドアクセスのThreadLocal
- 2. winフォームコントロールのマルチスレッドアクセスc#
- 3. .NETマルチスレッドアクセス
- 4. Android SQliteマルチスレッドアクセス
- 5. ブースト:: shared_ptrのとマルチスレッドアクセス
- 6. スウィフトネストされたディクショナリの行へのアクセス
- 7. TCriticalSectionは変数へのマルチスレッドアクセスを許可しますか?
- 8. C#のディクショナリ項目のLINQクエリ
- 9. マルチスレッドアクセスのクラスインスタンスを保護する
- 10. ディクショナリのメンバ 'subscript'へのあいまいな参照
- 11. Swiftへのディクショナリ変換 - 「コンテキストの種類が曖昧です。」
- 12. LINQを使用したC#ディクショナリの処理
- 13. フレックスのディクショナリ長の計算
- 14. タプル型のJavaディクショナリ値
- 15. プロパティとしての.NETディクショナリ
- 16. Swift:JSONディクショナリ値の解析
- 17. C#:オブジェクトを保存するディクショナリからTを返します
- 18. WPF UIコントロールに対するマルチスレッドアクセスのオーバーヘッドはなぜですか?
- 19. ディクショナリでキーによるディクショナリ<TKey、TValue>の順序はありますか?
- 20. 一般的なリスト/ディクショナリ
- 21. 参照によるディクショナリ値
- 22. PythonのディクショナリからのXML作成
- 23. 空のディクショナリのリストを作成
- 24. C#.NET Silverlightのディクショナリ内のキーの値に基づいてディクショナリのリストをソートするにはどうすればよいですか?
- 25. .NET:汎用ディクショナリのソート方法
- 26. mutableArrayにディクショナリのオブジェクトを代入する
- 27. バイナリツリーを使用したディクショナリの実装
- 28. C++からC#へのエンコード
- 29. C#からC++へのマーシャリング
- 30. CコードへのObjective-Cコード
正しい値が返されると思いますか? –
または単にConcurrentDictionaryを使用してください... http://msdn.microsoft.com/en-us/library/dd287191.aspx –