5

次のコード:

while (x == 1) { ... }

に最適化される可能性があります

while (true) { ... }

ifxは別のスレッドでのみ割り当てられます。C# での volatile キーワードの使用例の説明を参照してください。そこでの答えは、に設定xすることでこれを解決しますvolatile

しかし、これら 3 人の貢献者によると、それは正しい方法ではないようです (合計で 100 万人以上の評判があります :))。

Hans Passant volatile 使用の再現可能な例 : 「マルチスレッド シナリオで有用であると想定しないでください。」

Marc Gravell volatile 変数の値はマルチスレッドで変化しません: 「volatile は、動作を保証するために通常使用するセマンティックではありません」

Eric Lippert 原子性、揮発性、および不変性は異なります。パート 3 : 「揮発性フィールドを作成することはお勧めしません。」

Backgroundworkeraが他のマルチスレッドと同じように扱われると仮定すると(最適化を防止するメカニズムが組み込まれているのではなく)、最適化の悪さをどのように防ぐことができますか?

4

1 に答える 1

13

あなたは私の立場を少し誤解しています。フィールドを揮発性にすると、最適化が妨げられます。Volatile は C# では壊れていません。(C++、それは別の話です。)

私のポイントは、 volatile が期待どおりに機能しないということではありません。要点は、2 つの異なるスレッドで同じ変数を読み書きすることは、そもそも悪い考えだということです。プログラムを正しくするために volatile を使用する必要がある場合は、volatile をまったく必要としないようにプログラムを再設計することを検討してください。

于 2013-08-23T13:54:01.760 に答える