5

プログラムの最初に作成するキーの固定コレクションを持つ辞書があります。後で、辞書を値で更新するスレッドがいくつかあります。

  • スレッドが開始されると、ペアは追加または削除されません。
  • 各スレッドには独自のキーがあります。つまり、1 つのスレッドだけが特定のキーにアクセスします
  • スレッドは値を更新する可能性があります。

問題は、辞書をロックする必要があるかどうかです。

アップデート:

回答ありがとうございます。

辞書の動作を理解するために、この質問をしたときに状況を単純化しようとしました。

明確にするために、ここに完全なバージョンがあります: 私は ~3000 のエントリ (固定キー) を持つ辞書を持っており、キー (共有リソース) にアクセスする複数のスレッドがありますが、1 つのスレッドしかないという事実を知っています。一度にキーエントリにアクセスします。

では、辞書をロックする必要がありますか? そして - 今フルバージョンを持っているとき、辞書は正しい選択ですか?

ありがとう!

4

6 に答える 6

2

一度に 1 つの解釈であなたの質問に対処しましょう。

最初の解釈:がどのようDictionary<TKey, TValue>実装されているかを考えると、与えられたコンテキストで、辞書をロックする必要がありますか?

いいえ、あなたはしません。

2 番目の解釈:がどのようDictionary<TKey, TValue文書化されているかを考えると、私が与えたコンテキストで、辞書をロックする必要がありますか?

はい、間違いなくそうすべきです。

タイプがスレッドセーフでないと文書化されているため、マルチスレッドの世界では、今日は問題ないかもしれないアクセスが明日も問題ないという保証はありません。これにより、プログラマーは、そうでなければ保証を組み込む必要がある型の状態と整合性について、特定の仮定を立てることができます。

.NET のホットフィックスまたは更新、またはまったく新しいバージョンにより、実装が変更されて機能しなくなる可能性があります

3 番目の解釈:私が与えた文脈を考えると、辞書は正しい選択でしょうか?

いいえ、そうではありません。スレッドセーフなタイプに切り替えるか、単に辞書をまったく使用しないでください。代わりに、スレッドごとに変数を使用しないのはなぜですか?

結論:辞書を使用する場合は、辞書をロックしてください。別のものに切り替えても問題ない場合は、切り替えてください。

于 2013-10-15T10:03:30.700 に答える
0

Dictionary はスレッドセーフではありませんが、コードではそうする必要はありません。あなたは1つのスレッドが1つの値を更新すると言ったので、マルチスレッドの問題はありません! 私はコードを持っていないので、100%確信が持てません。

これも確認してください:辞書アクセスをスレッドセーフにしますか?

于 2013-10-15T10:02:35.083 に答える
0

キーを追加するのではなく、値を変更するだけの場合は、複雑なオブジェクトを値として格納し、複合型内の値を変更することで、ディクショナリに直接書き込む必要が完全になくなるのはなぜですか。そうすれば、ディクショナリのスレッド セーフ制約を尊重できます。

そう:

class ValueWrapper<T>
{
    public T Value{get;set;}
}
//...
var myDic = new Dictionary<KeyType, ValueWrapper<ValueType>>();
//...
myDic[someKey].Value = newValue;

ディクショナリに直接書き込むことはなくなりましたが、値を変更できます。

キーで同じことをしようとしないでください。必然的に、それらは不変でなければなりません

「一度に1つのスレッドだけがキーエントリにアクセスしているという事実を知っている」という制約を考えると、問題はないと思います。

于 2013-10-15T10:21:20.190 に答える