Interlocked
まず第一に、使用にまだvolatile
フィールド定義が必要かどうかを調べようとしていました。それが私の本当の質問です。
しかし。生成された MSIL を分析するのが面倒なので、実際に確認することにしました。
最適化をオンにしてリリースビルドでコードが壊れるはずの場合の使用法として、MSDN の例をvolatile
試しています。そして、何も壊れません。最適化をオンまたはオフにして、コードは正常に動作します (この場合、メイン スレッドは正常に終了します)。
- ロックなしで別のスレッド
volatile
を使用してあるスレッドからフィールドに書き込み、別のスレッドから読み取る場合、フィールドにキーワードが必要ですか?Interlocked
- 最初の質問のコードの簡単な例はどこで
volatile
違いが生じるのですか? volatile
キーワードを削除してリリースでビルドしても、MSDN の例がまだ機能するのはなぜですか?
質問 1 を説明するためのコード スニペット。
class Example
{
volatile int val;
void Do()
{
Task.Run(() => { while (val == 0) Console.WriteLine("running"); });
Thread.Sleep(1000);
Interlocked.Increment(ref val);
Console.WriteLine("done.");
Console.ReadLine();
}
}