1. ホーム
  2. c#

[解決済み] C#のvolatileキーワードの使い方を説明します。

2023-04-08 06:35:18

質問

の挙動を視覚的に説明する小さなプログラムを作りたいのですが、どうすればよいでしょうか? volatile キーワードの動作を視覚的に説明する小さなプログラムをコーディングしたいと思います。理想的には、揮発性のない静的フィールドへの同時アクセスを実行し、そのために不正な動作を取得するプログラムであるべきです。

同じプログラム内で volatile キーワードを追加すると、問題が解決するはずです。

それは私が達成することができなかったものです。何度か試し、最適化を有効にするなどしても、私はいつも「volatile」キーワードなしで正しい動作を得ます。

このトピックについて何かご存知でしょうか。簡単なデモ アプリでそのような問題をシミュレートする方法をご存知ですか? それはハードウェアに依存するのでしょうか?

どのように解決するのですか?

動作例ができました!

主なアイデアはwikiから受け取ったものですが、C#用に若干の変更を加えています。wikiの記事では、C++の静的フィールドに対してこれを示していますが、C#は常に静的フィールドへの要求を慎重にコンパイルしているように見えます...そして私は静的ではないものを使って例を作っています。

この例を リリース モードで実行し デバッガなし (すなわち Ctrl+F5 を使用) した場合、行の while (test.foo != 255) の行は 'while(true)' に最適化され、このプログラムは決して戻りません。 しかし volatile を追加すると、常に'OK'が返されます。

class Test
{
    /*volatile*/ int foo;

    static void Main()
    {
        var test = new Test();

        new Thread(delegate() { Thread.Sleep(500); test.foo = 255; }).Start();

        while (test.foo != 255) ;
        Console.WriteLine("OK");
    }
}