私はマルチスレッド環境でvolatileの使用を理解しようとしています。インターネット上のanother source of knowledgeから次のコードで:フラグフィールドにvolatileキーワードを使用する
class Program
{
static string _result;
//static volatile bool _done;
static bool _done;
static void SetVolatile()
{
// Set the string.
_result = "Dot Net Perls";
// The volatile field must be set at the end of this method.
_done = true;
}
static void Main()
{
// Run the above method on a new thread.
new Thread(new ThreadStart(SetVolatile)).Start();
// Wait a while.
Thread.Sleep(200);
// Read the volatile field.
if (_done)
{
Console.WriteLine(_result);
}
}
}
揮発性キーワードの実証された使用は、キャッシュに格納された値を読み取ることからスレッドを防ぐべきです。この代わりに、実際の値をチェックする必要があります。
したがって、揮発性のない_done
はまだ偽の値(キャッシュからの読み取り)を持ち、Console.WriteLine
ステートメントは実行しないでください。
残念ながら、このコードをデバッグ/リリースモードでvolatileキーワードなしで実行すると、常に出力が生成されます。この特定の例のポイントは何ですか?
コンパイラ(静的およびJIT)*は、標準を厳密に読めば、割り当てが決して見られないように読み込みを最適化することができます。しかし、これは必須ではなく、実際には.NET用(過去または現在)のJITコンパイラが実際にこれを行うとは思っていません。少なくともこの特定のケースではなく、x86/x64ではありません。 –
このようなことを理解したい場合は、いくつかの[重大なもの](http://www.albahari.com/threading/part4.aspx#_The_volatile_keyword)を読むことをお勧めしますか? – Sinatr
*「この例はvolatile修飾子なしで正しく機能するという点で理想的ではないことに注意してください。実際の例を提供するのではなく、 [インターネット](https://www.dotnetperls.com/volatile)から。 – Sinatr