0

複数のオブジェクトの複数のスレッドによってアクセスされる静的変数があります。問題は、あるスレッドで値を設定すると、別のスレッドに反映されないことです。この問題を解決するために、変数スレッドを静的にしましたが、あるスレッドで変更された値は別のスレッドに反映されます。それが私が変数を宣言した方法です:

[ThreadStatic]
public static string ThreadVar;

問題を解決する方法について何か提案はありますか?

4

1 に答える 1

4

コンパイラと JIT は、フィールドが複数のスレッドによって変更されないことを自由に想定でき、現在のスレッドがフェッチ間で値を変更できないことが証明できる場合、同じフィールドの再フェッチを最適化できます。

フィールドをマークするvolatileことは反対のことを伝えます: フィールドが外部の力 (他のスレッドを含む) によって変更されることを期待していること、およびコンパイラ/JITが再フェッチを最適化してはならないことを伝えます。

フィールドにマークを付けても、フィールドvolatileのすべての使用法がスレッドセーフであることをすぐに意味するわけではなく、別のスレッドによって新しい値がフィールドに書き込まれたときに、あるスレッドが気付くことを意味するだけであることに注意してください。スレッド セーフの問題があるかどうかを判断するには、コードをさらに確認する必要があります。

[ThreadStatic]、比較すると、各スレッドが変数の独自のコピーを持つ必要があることをコンパイラーに伝えます。これは、質問に基づいて、あなたが望むものではありません。

于 2014-07-28T14:50:34.757 に答える