要素の追加、読み込み、削除に関して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. winフォームコントロールのマルチスレッドアクセスc#
- 2. C#Excelファイルのマルチスレッドアクセス
- 3. SimpleDateFormatへのマルチスレッドアクセスのThreadLocal
- 4. .NETマルチスレッドアクセス
- 5. Android SQliteマルチスレッドアクセス
- 6. ブースト:: shared_ptrのとマルチスレッドアクセス
- 7. TCriticalSectionは変数へのマルチスレッドアクセスを許可しますか?
- 8. スウィフトネストされたディクショナリの行へのアクセス
- 9. スパーク:2.0.2 java.util.ConcurrentModificationExceptionが:KafkaConsumerは、マルチスレッドアクセス
- 10. C#のディクショナリ項目のLINQクエリ
- 11. C#ディクショナリでの値型の制限:
- 12. マルチスレッドアクセスのクラスインスタンスを保護する
- 13. 3次元ディクショナリをCで値でソート
- 14. ネストされたディクショナリ内の単一の要素へのアクセス
- 15. Swiftへのディクショナリ変換 - 「コンテキストの種類が曖昧です。」
- 16. ディクショナリへの値の追加が持続しない
- 17. POSTリクエスト用のJSONへのネストされたディクショナリPython
- 18. ディクショナリのメンバ 'subscript'へのあいまいな参照
- 19. TableNameをキーとしたDataTableからjsonディクショナリへの変換
- 20. 特定のキーのディクショナリの合計値C#
- 21. C#のディクショナリ内のDistinct valueインスタンスのカウントを取得
- 22. C#ダイナミックアレイのダイナミックアレイを含むディクショナリの初期化
- 23. c#ディクショナリの置換の結果を追加
- 24. 負の符号値によるディクショナリとリスト宣言のエラーC#
- 25. ディクショナリCの一重引用符を置換する#
- 26. LINQを使用したC#ディクショナリの処理
- 27. WPF UIコントロールに対するマルチスレッドアクセスのオーバーヘッドはなぜですか?
- 28. C++クラスへのC++ DLLへのC#Windowsフォームクラスへの変換
- 29. フレックスのディクショナリ長の計算
- 30. C#:オブジェクトを保存するディクショナリからTを返します
正しい値が返されると思いますか? –
または単にConcurrentDictionaryを使用してください... http://msdn.microsoft.com/en-us/library/dd287191.aspx –