可变关键字对intel cpu下的.net核心有用吗?

时间:2019-02-04 16:38:21

标签: c# multithreading .net-core volatile

我尝试了一些有问题的情况,其中volatile对.NET Framework有帮助。但是,在.NET Core下,我还没有发现volatile实际上有帮助的一个案例。 .NET Core的内存模型是否比.NET Framework更强,这样我们就不再需要volatile了?

作为示例,如果您使用发布模式构建.net框架,则以下代码会无限期地阻塞,但如果不使用.net内核,则以下代码将无限期阻止。原因是,在.net情况下,该值存储在寄存器中并缓存:

    class Program
    {
        static bool complete = false;
        static void Main()
        {

            var t = new Thread(() =>
            {
                bool toggle = false;
                while (!complete) toggle = !toggle;
            });
            t.Start();
            Thread.Sleep(1000);
            complete = true;
            t.Join();        // Blocks indefinitely
        }
    }

1 个答案:

答案 0 :(得分:1)

根据this article,C#中的volatile告诉编译器/ JIT发布防止指令重新排序的指令。尽管通常在Intel平台上.NET的内存模型足够强大,几乎不会发生排序,但是在其他平台(例如ARM)上却一无所知。

换句话说,除非您担心重新排序会破坏代码,否则几乎不需要使用volatile。同时,在涉及多线程时,最好始终保持安全。