volatile 关键字在 intel cpu 下对 .net core 有用吗?

Is volatile keyword useful with .net core under intel cpu?

我尝试了几个有问题的案例,其中 volatile 对 .NET Framework 有帮助。然而,在 .NET Core 下,我还没有发现 volatile 实际上有帮助的一个案例。 .NET Core 的内存模型是否比 .NET Framework 更强大,以至于我们不再需要 volatile?

例如,如果您使用发布模式构建以下代码,则它会无限期地与 .net Framework 一起阻塞,但它不与 .net Core 一起构建。原因是,在 .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
        }
    }

根据 this article,C# 中的 volatile 告诉编译器/JIT 发出防止指令重新排序的指令。虽然 .NET 在 Intel 平台上的内存模型通常足够强大以至于很少发生排序,但在其他平台(例如 ARM)上你永远不知道。

换句话说,很少需要使用 volatile,除非您担心重新排序会破坏您的代码。同时,说到多线程,还是稳妥为上策。