2012-03-30 8 views
2

要素の追加、読み込み、削除に関してC#ディクショナリはスレッドセーフではないことを理解しています。ただし、別のスレッドが辞書に書き込み、読み取り、および削除している場合、C#ディクショナリのCountプロパティにスレッドセーフな方法でアクセスできますか?C#ディクショナリへのマルチスレッドアクセス

+2

正しい値が返されると思いますか? –

+0

または単にConcurrentDictionaryを使用してください... http://msdn.microsoft.com/en-us/library/dd287191.aspx –

答えて

0

辞書を静的な読み取り専用オブジェクトとして作成し、それを変更するときにはlock ...ほとんどの問題に対処する必要があります。

2

プロパティはボンネットのフードの下のメソッドコールなので、実際の状況は一見したほど単純ではありません。

  • T1:アクセスCountプロパティ
  • T1:get_Count()呼び出し(JMP/GOTO ASM命令のいくつかの種類)
  • T1:アイテムの数を表す変数を読み取る== 1つの
  • T2 :新しいアイテムをaddign、実際のカウントは2
  • T1となります。アプリケーション・ロジックがに依存しているのであれば1を返しますが、実際には2つの項目

が既に存在しています理論上はrace conditionで終わる可能性があります。

+0

プロパティを直接書き込むことはできないため、プロパティを同時に読み取っても問題ありません。後者は前者には従いません。これは危険な考えです。 – usr

+0

私は自分の答えを書いている過程で、最初は私の考えは間違っていた、あなたは正しい。 – sll

4

スレッドセーフでなければなりませんが、それはスレッドセーフではないということは、他のスレッドが辞書を操作しているために正確なカウントが得られない可能性があるということです。

[編集:usrが指摘しているように、現在このレベルでスレッドセーフであるという理由だけで、それはそのままであるとは限りません。あなたは保証がありません]

0

あなたが達成したいことに応じて、ReaderWriterLockSlimで辞書を保護することができます。このようにして、突然変異操作を実行するときに読み込みを高速化し、辞書をロックすることができます。

0

よりもむしろ仮定し、私が行って、反射鏡でそれを見て:

public int Count 
{ 
    get 
    { 
     // count and freeCount are local fields 
     return (this.count - this.freeCount); 
    } 
} 

そうです、それはそれは辞書オブジェクトで破損が発生することはありませんアクセスする際に、「スレッドセーフ」です。つまり、ある辞書が別のスレッドによってアクセスされている場合は、何らかの精度でカウントを取得することが重要なユースケースを考えることができるとは思えません。

+0

'if(dict.Count == 1)'決して*安全に*働かない –

+0

@ L。Bあなたは私の答えの最後にパラグラフを読んだのですか? –

+0

私は答えを全部読まずにコメントを書いていると思いますか? 「辞書が別のスレッドによってアクセスされている場合、何らかの正確さでカウントを取得することが重要なユースケースについて考えることができます」あなたの想像力では正解だが限定されている。 –

1

まず、これは危険な考えです。あなたがそのようなものを生産に入れるなら、非常に注意してください。おそらく、ロックまたはConcurrentDictionaryを使用するだけです。

おおよその回答で快適ですか?

しかし、:リフレクターは、カウントがちょうどいくつかのフィールドを読み取り、それを返すことを示しています。これは永遠に変わらない可能性が高いです。そうすれば、この場合リスクを冒すことができます。

関連する問題