小编典典

说明C#中volatile关键字的用法

c#

我想编写一个小程序,以可视方式说明volatile关键字的行为。理想情况下,它应该是对非易失性静态字段执行并发访问并因此而获得错误行为的程序。

在同一程序中添加volatile关键字应该可以解决此问题。

那是我无法实现的。即使尝试几次,启用优化等,我也总是得到正确的行为而没有’volatile’关键字。

您对此主题有任何想法吗?您知道如何在简单的演示应用程序中模拟此类问题吗?它取决于硬件吗?


阅读 652

收藏
2020-05-19

共1个答案

小编典典

我已经取得了一个可行的例子!

主要思想来自Wiki,但C#有所更改。Wiki文章针对C ++的静态字段演示了这一点,似乎C#总是仔细地将请求编译为静态字段…而我以非静态示例为例:

如果您在 发布 模式下并且 没有调试器 (即使用Ctrl + F5)运行此示例,则该行将while (test.foo != 255)被优化为“ while(true)”,并且该程序永不返回。但是添加volatile关键字后,您始终会获得“确定”。

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");
    }
}
2020-05-19