2011-06-29 13 views
2

私はvolatileの基本的な考え方に精通しています(要約すると、複数のスレッドからアクセスできる値を含む命令のコンパイラの最適化を防ぐためです)が、volatileと.NET 3.5私は現在のコンテキストで.NET 4を使用できません。volatileはコレクション自体には適用されません。もちろん、コレクション(またはそれに対応するロックobject)は複数のスレッドからアクセスするときにロックする必要がありますが、コレクションにvolatileというマークを付けるべきではないという理由がありますか?コレクションのタイプは重要です(つまり、Listの値タイプとListの参照タイプ)。(非並行)コレクションでvolatileを使用する必要がありますか?

答えて

7

Volatile almost certainly doesn't mean what you think it does.それはそれを使用しない主な理由です。 (最近、私は揮発性の意味を説明しようとすることを拒否します。それはきちんと説明するのは複雑すぎるし、あなたが間違いなくメモリモデルの専門家でなければ間違ったアプローチです。それはあなたに)

あなたが適切なオブジェクトにロックしている場合、それはあなたに何の利益を与えると思いますか?あなたはすでにロックを取得して解放するのに適切なメモリフェンスを通過しようとしています...変数自体にvolatileを使用する理由が誤解に基づいていると思われます。

+0

ここで言及したように、volatileを使用したいという私の望みは、効果的なマルチスレッド動作を得るためにはvolatileとlockの両方を必要とする事実上の事実に基づいています。 – Kongress

+1

@Kongress:非常に、非常に評判の良いソースから来ない限り、あなたが「揮発性」やマルチスレッドで読んだものは信用しないでください。ほとんどの書籍でさえそれが間違っています。 – jason

+0

@Jasonフェア十分です。私はいつもわかっていないときに専用のロックオブジェクトを使用するように、私はいつもかなり心配していましたが、一般的に安全であるように(揮発性の)それを投げることはできません。私はそれを完全にやめて、ロックするだけでいいですか? – Kongress

1

ロックを使用するだけで済みます。あなたが記述しているものにはvolatileが必要です。

3

参照を変更していない場合(つまり、新しい無関係なコレクション全体を作成してフィールド内に置き換える場合)、volatileは何も行いません。個人的には、おそらく、スレッド集約のケースでは、コレクションフィールドreadonlyとすると、事故を防ぐために(そしてlockを使用します)。

だからおそらく:いいえ。

+0

私は 'readonly'というアイディアが好きです。それを考えなかった。 – Kongress

3

実際にコレクションの参照を変更していない場合(つまり、コレクションを参照する変数に新しいコレクションを繰り返し割り当てる場合)、その変数をvolatileとマークする理由はありません。つまり、それはそうだと思う)。

もしあなたが(あなたが何をやっているのか疑問に思っても)lockが適切であればvolatileが必要であることは明らかではありません。

ところで、この主題は本当に難しいです。本当に、本当に、本当に難しい。

0

揮発性のコレクションにマークを付けると、コレクション全体ではなく参照自体がマークされます。

関連する問題