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
,除非您担心重新排序会破坏您的代码。同时,说到多线程,还是稳妥为上策。
我尝试了几个有问题的案例,其中 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
,除非您担心重新排序会破坏您的代码。同时,说到多线程,还是稳妥为上策。